2018CCPC吉林赛区 The Hermit

//昨天在杭电上有了重现赛,组队打了一下,这个题没做出来,公式推的过程有点复杂,以后要多做做这种思维题,其实只要推出公式,代码就那么几行,放题~~~

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)<=1i-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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值