您的位置:首页 > 产品设计 > UI/UE

[Codeforces297C]Splitting the Uniqueness(构造)

2016-05-25 19:30 537 查看

题目描述

传送门

题解

构造ab

令t=⌈n3⌉

对于i=1…t a[i]=i

对于i=t+1…n-t b[i]=i

对于i=n-t+1…n b[i]=n-i+1

知道了ab中的一个另一个根据s算出来

这样构造出来就是这样一个图



其中红色为a,蓝色为b

可以发现加粗的部分是保证不同的,满足题目的要求。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max_n=1e5+5;
int n,t;
struct hp{int val,id;bool vis;}s[max_n],a[max_n],b[max_n];

inline int cmp(hp a,hp b)
{
return a.val<b.val;
}
inline int cmp1(hp a,hp b)
{
return a.id<b.id;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&s[i].val);
s[i].id=i;
}
sort(s+1,s+n+1,cmp);
if (n%3==0) t=n/3;
else t=n/3+1;
for (int i=1;i<=n;++i) a[i].id=b[i].id=s[i].id;
for (int i=1;i<=t;++i)
{
a[i].val=i-1;
a[i].vis=true;
}
for (int i=t+1;i<=n-t;++i)
{
b[i].val=i-1;
b[i].vis=true;
}
for (int i=n-t+1;i<=n;++i)
{
b[i].val=n-i;
b[i].vis=true;
}
for (int i=1;i<=n;++i)
if (a[i].vis) b[i].val=s[i].val-a[i].val;
else a[i].val=s[i].val-b[i].val;
sort(a+1,a+n+1,cmp1);
sort(b+1,b+n+1,cmp1);
printf("YES\n");
for (int i=1;i<=n;++i)
printf("%d%c",a[i].val," \n"[i==n]);
for (int i=1;i<=n;++i)
printf("%d%c",b[i].val," \n"[i==n]);
}


总结

构造题好好想一想,不要上来就写,写了就错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: