题面
警惕国奖爷打牌
2000ms 1MB
Description
众所周知,国奖爷非常爱打牌,现在国奖爷手上有编号从 L L L到 R R R的若干张牌,为防止国奖爷打牌,正义的鸽谭英雄比特侠(BitMan)出手,打乱了国奖爷的牌,并从中取走一张。现在,被国奖爷收买的你,要帮国奖爷判断,被拿走的是哪一张牌。
Input Description
第一行两个整数 L , R L, R L,R。
第二行 R − L R-L R−L个整数 a i a_i ai,分别代表国奖爷手上剩余牌的编号。
对于所有的数据 L , R L, R L,R, − 1 0 9 < L < R < 1 0 9 -10^9<L<R<10^9 −109<L<R<109, − 1 0 9 < a i < 1 0 9 -10^9<a_i<10^9 −109<ai<109, R − L < 1 0 7 R-L<10^7 R−L<107。
Output Description
输出一行一个整数,表示国奖爷丢失的那张牌的编号。
Input Sample
1 5
4 2 1 5Output Sample
3
Hint
内存限制放不下所有的输入。
题解
由于内存放不下所有的数,可以考虑换一种方案,即求 L L L到 R R R的和,再逐个减去输入数据,这样只要存两个变量,求和、输入。同时考虑到输入数据 − 1 0 9 < a i < 1 0 9 -10^9<{a_i}<10^9 −109<ai<109,会爆int(32位整形,储存范围在[ − 2 31 -2^{31} −231, 2 31 − 1 2^{31}-1 231−1])所以可以考虑开long long(64位整形),或者直接用位运算求异或和(XOR)代替。注意不要使用cin,慢,可以用scanf函数,有能力的可以写快速读入。
代码
// by Concyclics
//
//
#include <cstdio>
int main()
{
int L,R,ans,ai;
scanf("%d %d",&L,&R);
ans=R;
for(int i=L;i<R;i++)
{
scanf("%d",&ai);
ans^=i;
ans^=ai;
}
printf("%d",ans);
return 0;
}