Toy Sum
题目描述:
题目大概讲述的是,输入n个数,分别记为。
然后题目让我们求满足(其中s=1e6)这个公式的集合Y中的所有元素,并且把这些元素输出出来。
题目规定集合X和集合Y不能存在交集。
题目分析:
首先对于每个,我们需要判断是否在X集合内,如果不在X集合内的话,那么我们就可以将这个数作为,因此将和代入上面的公式,我们会发现结果相等。
如果在X集合内的话,那么就说明和在集合X里面,那么这两者的和正好等于,于是我们随便找一个不在X集合内的元素以及插入到Y集合中,我们会发现这两者的和同样等于。
因此问题得到解决,先对不在X集合的情况作处理,然后再对在X集合内的情况做处理即可得到答案。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <string>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
const int s=1e6;
const int Maxn=5e5+5;
int x[Maxn];
vector <int> ans;
bool visit[s+5];
int main()
{
int n;
scanf("%d",&n);
for (reg int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
visit[x[i]]=1;
}
ll sum=0;
for (reg int i=1;i<=n;i++)
{
int y=(s-x[i]+1);
if (!visit[y])
{
visit[y]=1;
ans.push_back(y);
continue;
}
sum+=y;
}
for (reg int i=s;i>=0 && sum>0;i--)
{
if (!visit[i] && sum>=i)
{
sum-=s+1;
ans.push_back(i);
ans.push_back(s-i+1);
}
}
printf("%d\n",ans.size());
for (reg int i=0;i<ans.size();i++) printf("%d ",ans[i]);
return 0;
}