//昨天在杭电上有了重现赛,组队打了一下,这个题没做出来,公式推的过程有点复杂,以后要多做做这种思维题,其实只要推出公式,代码就那么几行,放题~~~
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1006&cid=867
题意:
先输入t(有多少组样例),再输入n,接下来n组radi(1<=i<=n)
k满足一下五个问题(我把问题细化了),可以接收i的完美信号:
1.k<i,k在[i-radi+1,i+radi-1]
2. 加入了一个类似于中转站的j(k<=j<i)
3.k在[i-radi+1,i+radi-1]
4.k在[j-radj+1,j+radj-1]
5.(S表示距离)Skj>=Sji
求的是有多少个站可以接收i(其实就是,对于每个i, k的个数,记作ai),然后将1<=i<=n,所有的a1 xor a2……xor an得到的值输出
解题过程:
其实就是求出k的范围(用i,radi,这些表示的不等式)
还有一个条件就是0<=rad(i+1)-rad(i)<=1 (题里给出了)
首先,如果令j=i-1,那么,对于i-radi+1<=k<=i-1可以满足1.2.3
其次,那么对于i-radi+1<=k<=i-2
Skj=k-j=k-(i-1)=k-i+1>=1
Sij=i-(i-1)=1
显然对于这个范围,可以满足5
最后,对于i-radi+1<=k<=i-2
将j=i-1带入条件4,即 i-rad(i-1)<=k<=i-2+rad(i-1)
通过 0<=rad(i+1)-rad(i)<=1 与i-radi+1<=k<=i-2 求交集得出i-radi+1<=k<=i-2 得到k的范围
每个i对应的个数就是 (i-2)-(i-radi+1)+1=radi-2
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
for (int i=1;i<=t;i++)
{
printf("Case %d: ",i);
int n,x,res=0;
scanf("%d",&n);
for (int j=1;j<=n;j++)
{
scanf("%d",&x);
res^=max(0,x-2);//比0小的就不管,当0算
}
printf("%d\n",res);
}
return 0;
}