AtCoder Regular Contest 135

C - XOR to All:

假设进行的操作是x,y。经过第一次操作y = y ^ x。

然后到了第二次操作就变成了(y ^ x),因为所有的数都已经^ x。那么就变成了^y。

所有这两次操作就相当于在原来的序列上^y。

所以可以发现对于多次操作之后,异或上的数永远都是最后一个,那么显然只要异或一个数求最大值即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int N = 1e6 + 5;
const int M = 1e7 + 5;
const LL Mod = 998244353;
#define rep(at,am,as) for(int at = am;at <= as;++at)
#define INF 1e10
#define dbg(ax) cout << "now this num is " << ax << endl;
inline long long ADD(long long x,long long y) {
    if(x + y < 0) return ((x + y) % Mod + Mod) % Mod;
    return (x + y) % Mod;
}
inline long long MUL(long long x,long long y) {
    if(x * y < 0) return ((x * y) % Mod + Mod) % Mod;
    return x * y % Mod;
}
inline long long DEC(long long x,long long y) {
    if(x - y < 0) return (x - y + Mod) % Mod;
    return (x - y) % Mod;
}

int n,a[N],bit[30];
void solve() {
    cin >> n;
    LL ans = 0;
    rep(i,1,n) {
        cin >> a[i],ans += a[i];
        rep(j,0,29) {
            if((a[i] >> j) & 1) bit[j]++;
        }
    }
    rep(i,1,n) {
        LL sum = 0;
        rep(j,0,29) {
            int g = (a[i] >> j) & 1;
            if(g == 1) {
                sum += 1LL * (n - bit[j]) * (1 << j);
            }
            else {
                sum += 1LL * bit[j] * (1 << j);
            }
        }
        ans = max(ans,sum);
    }
    printf("%lld\n",ans);
}   
int main() {
    // int _;
    // for(scanf("%d",&_);_;_--) {
        solve();
    //}
   // system("pause");
    return 0;
}
View Code

 

posted @ 2022-01-23 07:55  levill  阅读(48)  评论(0编辑  收藏  举报