AtCoder Regular Contest 098 D - Xor Sum 2
阿新 • • 發佈:2020-09-09
題意:
給一個長度為N的陣列
然後求滿足 他們的異或和 加和相等的區間
題解:
我們發現,一旦兩個數字有一位都是1,他們會變成0,所以這時候肯定就少了值,換句話說,兩個數異或的最大值,是兩個數的加和
所以列舉每個位置,然後向前異或,因為,所以每次最多20次向前
複雜度20*n,也就是log(ai)*n
#include<cstring> #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<ctime> #definell long long using namespace std; const int maxn=200005; int n,a[maxn],lef[maxn]; ll ans=0; int main(){ scanf("%d",&n); for(int i=1,las=0;i<=n;i++){ scanf("%d",a+i),lef[i]=las; if(a[i]) las=i; } for(int i=1,now,j;i<=n;i++){ now=a[i];for(j=lef[i];j;now^=a[j],j=lef[j]) if(now&a[j]) break; ans+=(ll)(i-j); } cout<<ans<<endl; return 0; }