牛客OI賽制測試賽3 B 毒瘤xor (貪心)
阿新 • • 發佈:2018-12-09
題意 思路 貪心去取高位的,對於這個數的而言,我們從高位到低位,我們肯定要儘量的去取高位,這樣才能找到和的最大值,那麼對於這位數的每一位而言,如果這n個數中的第位,其中有個1有個0,那麼我們肯定讓這位是1,因為我們有6個可以讓他變成高位1,那麼最後求出的和肯定最大,所以我們維護一個字首和,看看這些位是0多還是1多。 程式碼
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+100;
int sum[maxn][32];
int main()
{
int n;
scanf ("%d",&n);
int a;
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&a);
for(int j = 0 ; j < 32 ; j ++) sum[i][j] = sum[i-1][j] +(a >> j & 1);
}
int q;
scanf("%d",&q);
while(q--)
{
long long ans = 0;
int L,R;
cin >>L>>R;
int len = R - L + 1;
for(int i = 0 ; i < 31 ; i++)
{
if(sum[R][i] - sum[L-1][i] << 1 < len)
{
ans |=1<<i;
}
// cout<<ans<<endl;
}
cout<<ans<<endl;
}
}