[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]); }
总结
构造题好好想一想,不要上来就写,写了就错。相关文章推荐
- iOS开发之高级视图—— UITableView(六)表视图刷新
- arduino 资料
- iOS _ UILabel 调整行间距
- SDUT-2169-Sequence(DP)
- find,vim的编程设置,SUID,SGID,SBIT,软.硬链接,重定向
- UILable 设置多种字体颜色
- iOS开发UI篇—核心动画(转场动画和组动画)
- 对AbstractQueuedSychronizer的粗略理解
- Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配
- Helper2416开发板移植minigui3.0.12之二:移植到开发板
- Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)
- IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE
- Arduino入门(二)
- iOS开发UI篇—iPad开发中得modal介绍
- Codeforces Round #353 (Div. 2) A. Infinite Sequence
- serialVersionUID的作用
- Material Design UI Widgets ——CoordinatorLayout (协调者布局)
- 一个简单的UI动态查询报表例子
- priority_queue&queue使用实例
- MYSQL CLUSTER questions