1. 程式人生 > 實用技巧 >D. XOR-gun

D. XOR-gun

給出一個長度為n非遞減的序列a,可以執行操作

選擇兩個相鄰的數字將他們刪去,並在此位置新增他們的異或和。

問最少需要多少次操作使序列不是非遞減的?2n105,1ai109

我們發現一旦出現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;
int
a[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; }