1. 程式人生 > >牛客OI賽制測試賽3 B 毒瘤xor (貪心)

牛客OI賽制測試賽3 B 毒瘤xor (貪心)

題意
這裡寫圖片描述
思路
貪心去取高位的 1 ,對於這 n 個數的而言,我們從高位到低位,我們肯定要儘量的去取高位

1 ,這樣才能找到和的最大值,那麼對於這 n 位數的每一位而言,如果這n個數中的第 x 位,其中有
5
個1有 6 個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; } }