毒瘤xor
毒瘤xor
https://ac.nowcoder.com/acm/problem/18979
//毒瘤xor #include <bits/stdc++.h> using namespace std; typedef long long ll; int arr[100005][34]; int b[34]; int main() { int i,n,j,t; ll x; cin>>n; for(i=1;i<=n;i++) { cin>>x; for(j=0;j<31;j++) { arr[i][j]=(x>>j)&1;//输入,存末尾数字 } } for(i=1;i<=n;i++) for(j=0;j<31;j++) arr[i][j]+=arr[i-1][j];//前缀和一波 cin>>t; while(t--) { ll x,y; ll result=0;//结果 memset(b,0,sizeof(b)); cin>>x>>y; cin.clear(); if(x==y)//如果区间只有一个数,特判 for(i=0;i<31;i++) b[i]=!(arr[x][i]-arr[x-1][i]); else for(i=0;i<31;i++) { if((arr[y][i]-arr[x-1][i])>(y-x)/2) b[i]=0;//如果0多,异或1 else b[i]=1;//反之 } for(i=31;i>=0;i--) result+=b[i]*pow(2,i);//二转十 cout<<result<<endl; } }