D. XOR-gun
阿新 • • 發佈:2020-12-05
給出一個長度為n非遞減的序列a,可以執行操作
選擇兩個相鄰的數字將他們刪去,並在此位置新增他們的異或和。
問最少需要多少次操作使序列不是非遞減的?2≤n≤105,1≤ai≤109
我們發現一旦出現n>60的,一定出現某三個數的最高位相同,那麼使得前兩個數xor 得到結果
否則,暴力列舉區間左端點,右端點,中間點。
區間異或使用區間異或出來的字首和,因為a xor a = 0
#include<bits/stdc++.h> #define ll long long #define inf 1e17 using namespace std; const int N=1e5+5; inta[N],sum[N],ans=n+1; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]^a[i]; } if(n>60){ printf("1\n"); return 0; } for(int i=1;i<=n;i++) for(int j=i+2;j<=n;j++)for(int k=i;k<j;k++) if(sum[k]^sum[i-1]>sum[j]^sum[k]) ans=min(ans,j-i-1); printf("%d\n",ans==n+1?-1:ans); return 0; }