洛谷 P4301 [CQOI2013] 新Nim游戏(线性基,贪心)
传送门
前置知识:
解题思路
注意两人各进行一次操作,所以目的就是要使对方不管怎么拿,都不能到达一个异或和为0的状态。
所以相当于第一次操作结束后,必须保证任意元素异或值不为0。
这就很典型的线性基了,并且和[BJWC2011]元素这个题完全一样,贪心取即可。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
int n,a[105],p[65];
long long ans;
void insert(int x){
for(int i=32;i>=0;i--){
if(x&(1ll<<i)){
if(p[i]) x^=p[i];
else{
p[i]=x;
return;
}
}
}
}
bool check(int x){
for(int i=32;i>=0;i--){
if(x&(1ll<<i)){
if(p[i]) x^=p[i];
else return 1;
}
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=n;i>=1;i--){
if(check(a[i])) insert(a[i]);
else ans+=a[i];
}
cout<<ans;
return 0;
}