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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章