1. 程式人生 > >U14739 X ask Y III 子區間異或和

U14739 X ask Y III 子區間異或和

很多 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
#define
ls 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 ********************/
View Code

U14739 X ask Y III 子區間異或和