更衣人偶坠入爱河正在播出中,不知道大家是否喜欢这部作品.
本题的题目与其他题目不同,为一个莫名其妙的数字,在某个不可描述的网站上貌似可以搜出相对应的内容.
题目链接
题意
将 [ l , r ] [l,r] [l,r]之间的数重新排列,再将所有数和一个五条确定的数 x x x相异或得到一个序列 a a a,你需要帮海梦确定 x x x是多少,任一解均可.
题解
先看简单难度,
l
=
0
l=0
l=0.这个很简单,因为最终的序列当中必定有一个数是
0
0
0变成的,因此对二进制的每一位计算
a
a
a数组和
[
l
,
r
]
[l,r]
[l,r]相比
1
1
1的个数是否相等,如果不相等,
x
x
x的这一位便为
1
1
1,如此便可通过.
然后我妄图用简单难度的做法通过困难难度,无疑是螳臂当车,用这个数据便可轻松叉掉.
1
1 2
0 3
我当然会输出
0
0
0,因为
a
a
a数组和
l
,
r
l,r
l,r相对应的二进制位上的
1
1
1的个数完全相同.
如何解决这个问题,当然是倒着做,从
a
a
a数组回到
l
,
r
l,r
l,r.
把
a
a
a数组排序,假设
x
x
x的第
i
i
i位为
0
0
0,则
a
a
a数组在这一位的每个
1
1
1的位置必须和
[
l
,
r
]
[l,r]
[l,r]一样.否则
x
x
x的这一位必定是
1
1
1.如果不能,将整个数组全部异或
2
i
2^i
2i,然后重新排序,再往后寻找,则到最后一位结束后,该序列必定变成
l
,
r
l,r
l,r,此时我们就求出了
x
x
x.
const int yuzu=2e5;
typedef int fuko[yuzu|10];
fuko a;
int main() {
for (int t=read();t--;) {
int l,r,i,j;
read(l),read(r);
for (i=l;i<=r;++i) a[i]=read();
int zw=0;
for (i=16;~i;--i) {
sort(a+l,a+r+1);
for (j=l;j<=r;++j) {
if ((a[j]>>i&1)^(j>>i&1)) {
zw|=1<<i;
for (int g=l;g<=r;++g) a[g]^=1<<i;
break;
}
}
}
printf("%d\n",zw);
}
}
谢谢大家.