序列s有n个数,每个数都是不同的,把它每个数分成两个数,组成两个序列a和b,使ab序列各自去掉个数后各自的其它数字都不同。

如果存在一个划分,就输出YES,并且输出两个序列,否则输出NO。

分析

两个月前做的一题,那时候问学长才会做的,现在刚看到题又懵逼了。再做过了一遍。

序列s的每个数都是不同的,我们先给s按递增排序,然后构造:k=

  个数 第二个个数  剩下≤个数
s s[i] s[i+k] s[i+2*k]
a s[i] 0  
b 0 s[i+k] 0 1 2 ...  ..2 1 0 即k-i

1≤i≤k

分配完前两段,问题变成除去k个0后,剩下的数都要不同。

因为i每增加1,s[i]至少增加1,所以 b的第k+1个数≥k,也就是是说b这个序列中间那一段数是≥k的,那后面≤k个数就可以放上0到k-1了。因为s[i]递增了,要让si-bi的数也不同,那bi要递减才能保证。那会不会和前面冲突呢?不会。因为a的第三段最小的是i=1时的s[i+2*k]-k+1,a第一段最大的是s[k],又因为si是互不相同的,所以有s[i+2*k]-s[k]≥k+1,所以s[i+2*k]-k+1-s[k]≥2,所以a第三段所有数都大于第一段任意数。

cf上题解的做法是

  个数 第二个个数  剩下≤个数
s s[i] s[i+k] s[i+2*k]
a 0 1 2... k-1    
b   k k+1 k+2 ... ..2 1 0 即k-i

代码

#include<cstdio>
#include<algorithm>
using namespace std; const int N=1e5+; struct p
{
int v,id,s;
} a[N];
bool cmp(p a,p b)
{
return a.v<b.v;
}
bool cmp1(p a,p b)
{
return a.id<b.id;
}
int n;
int main()
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&a[i].v);
a[i].id=i;
}
printf("YES\n");
sort(a+,a++n,cmp);
int k=n/;
if(n%) k++;
for(int i=; i<=k; i++)
{
a[i].s=;
a[i+k].s=a[i+k].v;
a[i+k*].s=k-i;
}
sort(a+,a++n,cmp1);
for(int i=; i<n; i++)
{
printf("%d ",a[i].s);
}
printf("%d\n",a[n].s);
for(int i=; i<n; i++)
{
printf("%d ",a[i].v-a[i].s);
}
printf("%d\n",a[n].v-a[n].s);
return ;
}

  

【CodeForces 297C】Splitting the Uniqueness的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 754A】Lesha and array splitting

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【codeforces 750D】New Year and Fireworks

    time limit per test2.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...

  4. 【codeforces 766C】Mahmoud and a Message

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  6. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  7. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  8. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  9. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

随机推荐

  1. vim支持lua

    1. ncurses 安装 官网下载:http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz CSDN 下载:http://download.csd ...

  2. UESTC 1227 & POJ 3667 Hotel

    非常细腻的线段树题目啊,后来还是有个细节写错了,查了一个晚上..就不分析了. 代码: #include <iostream> #include <cstdio> #includ ...

  3. Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常

    消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...

  4. web安全测试工具的局限性

    讨论安全漏洞的原理,谈谈工具的局限. 先说下扫描工具的原理: 扫描工具可以看做由两部分组成:爬虫+校验机构.爬虫的作用是搜集整个被采集对象的链接,然后校验机构对这些链接逐一进行验证. 说扫描工具的局限 ...

  5. Eclipse去除JavaScript验证错误

    这篇文章主要是对Eclipse去除js(JavaScript)验证错误进行了介绍.在Eclipse中,js文件常常会报错.可以通过如下几个步骤解决 第一步: 去除eclipse的JS验证: 将wind ...

  6. Sql注入截取字符串常用函数

    在sql注入中,往往会用到截取字符串的问题,例如不回显的情况下进行的注入,也成为盲注,这种情况下往往需要一个一个字符的去猜解,过程中需要用到截取字符串.本文中主要列举三个函数和该函数注入过程中的一些用 ...

  7. Block 的基本用法

    iOS中Block的基础用法 转载自简书 本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对 ...

  8. sqlzoo.net刷题3

    Find the continents where all countries have a population <= 25000000. Then find the names of the ...

  9. MString 与 QString 互转

    MQtUtil static MString  toMString (const QString &qstr)   Convenience utility to convert a QStri ...

  10. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...