U14739 X ask Y III 子區間異或和
阿新 • • 發佈:2017-11-25
很多 display c++ space code ask lose eps 區間
題意:就是求所有子區間的異或和的和
題解:就是算每一位對結果的貢獻(最近好像遇到很多次這種題目),先前綴異或,從左向右掃記錄二進制前綴的1,0個數,xor[i]==xor[j]^1的時候就加上這一位的權值
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define mod 20090717 #define C 0.5772156649 #defineView Codels l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pii pair<int,int> using namespace std; const double g=10.0,eps=1e-12; const int N=200000+10,maxn=200000+10,inf=0x3f3f3f3f; ll a[N]; ll one[50],zero[50]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n;for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1]; ll sum=0; for(int i=0;i<=n;i++) { for(int j=0;j<30;j++) { if(((a[i]>>j)&1))//1 { sum+=zero[j]*(1ll<<j); one[j]++; }else { sum+=one[j]*(1ll<<j); zero[j]++; } } } cout<<sum<<endl; return 0; } /******************** 2 1 2 ********************/
U14739 X ask Y III 子區間異或和