题意:
从1到10^6的数字 X子集合有其中n个数 每个数的值为 如果这个数<=5*10^5就是这个数-1 否则为10^6-这个数 求 找出一个Y集合 使得它和X集合中数字的值的和相同
思路:
可以想到对称的去找数字 如果一个数字没和与它对称的数字同时出现在X中 则Y中就放与它对称的数字
如果同时出现 我们可以证明 只需要找与它们值的和相同的一对同时不出现在X中的数字就可以
证明很简单 如果X中m个不成对出现 除去它们和与它们对称的数字还剩下amount - 2*m个数字 这些数字都是成对出现的 因为n的个数的限制 最多只能取这里的一半 那么至少还剩另一半留给了Y
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 500000
int n,tot,s=1000000;
int dig[M+10][2],ans[M+10];
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&j);
if(j<=M) dig[j-1][0]=1;
else dig[s-j][1]=1;
}
for(i=0,j=0;i<M;i++)
{
if(dig[i][0]&&!dig[i][1]) ans[tot++]=s-i;
else if(!dig[i][0]&&dig[i][1]) ans[tot++]=i+1;
else if(dig[i][0]&&dig[i][1]) j++;
}
for(i=0;j;i++)
{
if(!dig[i][0]&&!dig[i][1])
{
j--;
ans[tot++]=i+1;
ans[tot++]=s-i;
}
}
sort(ans,ans+tot);
printf("%d\n",tot);
printf("%d",ans[0]);
for(i=1;i<tot;i++) printf(" %d",ans[i]);
printf("\n");
return 0;
}