原题题面太长了,不想放在上面浪费版面,直接简单说一下中文简化题面。当时感觉这题有点像贪心,结果发现自己的第一感觉还是错的,直接弃疗。
题面
在一个
1
−
N
1-N
1−N的一维坐标系上有
N
N
N个基站,每个基站的位置
X
i
=
i
X_i=i
Xi=i,对于每个基站而言有一个辐射半径为
r
a
d
i
rad_i
radi,于是对于基站
i
i
i的辐射范围则为
[
i
−
r
a
d
i
+
1
,
i
+
r
a
d
i
−
1
]
[i-rad_i+1,i + rad_i-1]
[i−radi+1,i+radi−1],并且保证基站辐射范围的左边界单调不减。
对于基站
i
i
i定义其信号接收的完美基站
k
k
k,其中
k
k
k满足以下条件:
k
<
i
k < i
k<i
存
在
j
(
k
<
=
j
<
i
)
s
.
t
.
d
i
s
(
k
,
j
)
>
=
d
i
s
(
i
,
j
)
存在j(k<=j<i) \quad s.t. \quad dis(k,j)>=dis(i,j)
存在j(k<=j<i)s.t.dis(k,j)>=dis(i,j)
i
,
j
的
信
号
均
能
够
覆
盖
到
k
i,j的信号均能够覆盖到k
i,j的信号均能够覆盖到k
对于
i
i
i,定义
a
i
a_i
ai为
i
i
i能够完美覆盖的节点个数,求
a
i
a_i
ai的异或和。
分析
因为
j
j
j的选择比较自由,不妨令
j
=
i
−
1
j=i-1
j=i−1,并且只有
k
<
i
−
1
k<i-1
k<i−1时,
k
,
i
,
j
k,i,j
k,i,j才满足距离的条件,所以我们来考察一下
k
k
k满足的性质。
若
i
i
i能够覆盖到
k
k
k的前提下,
j
j
j的信号一定能够覆盖到
k
k
k,于是问题转化成
i
i
i左边能够覆盖的节点个数的值减2的异或和。
#include <bits/stdc++.h>
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
using namespace std;
int main(){
ios::sync_with_stdio(false);
int T = 0;
cin >> T;
rep( t , 1 , T ){
int N = 0 , x , ans = 0;
cin >> N;
for( int i = 1 ; i <= N ; ++i ){
cin >> x;
if( i > 2 && x > 2 ){
ans ^= (x - 2);
}
}
printf("Case %d: %d\n" , t , ans);
}
return 0;
}