洛谷 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;
}
posted @ 2021-10-28 13:33  尹昱钦  阅读(28)  评论(0编辑  收藏  举报