CF1415D XOR-gun 题解
首先,如果只用一次操作就能把序列变成非不降序列,那么就输出
我们发现,如果存在连续的三个数,它们在二进制下的最高位是同一位(例如
所以,如果只用一次操作行不通的话,那么对于每个二进制位,以它为最高位的数最多只有
(同样地,若
暴力时,先对序列做一遍前缀异或和。由于要操作的一定是相邻的两个区间内的所有数,所以我们枚举断点,答案取最小值即可。注意特判无解的情况。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,a[100005],x,y,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<=n-2;++i){
x=a[i]^a[i+1];
if(x<a[i-1] || x>a[i+2]){
printf("1\n");
return 0;
}
}
for(int i=1;i<=n;++i)a[i]^=a[i-1];
ans=n;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
for(int k=i;k<j;++k){
x=a[k]^a[i-1];
y=a[j]^a[k];
if(x>y)ans=min(ans,j-i-1);
}
}
}
printf("%d\n",ans<n?ans:-1);
return 0;
}