洛谷 [P4301] 新Nim游戏

线性基 +博弈论

先手必胜当且仅当先手取完之后留下的序列无论如何组合,异或和都不为 0
也就是剩下的整数线性无关,所以我们对所有整数排序,由高往低的贪心的插入线性基,
无法插入的就有先手取出,容易发现,先手必胜

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define ll long long
using namespace std;
ll n, lb[105], a[105], ans;
bool insert(int x) {
	for(int i = 32; i >= 0; i--) {
		if(x >> i & 1ll) {
			if(!lb[i]) {
				lb[i] = x;
				return 1;
			}else x ^= lb[i];
		}
	}
	return 0;
}
int main() {
	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(!insert(a[i])) ans += a[i];
	}
	cout << ans << endl;
	return 0;
}
posted @ 2018-03-30 21:21  Mr_Wolfram  阅读(112)  评论(0编辑  收藏  举报