sg博弈

这种题型最近碰到的有点多。。先记录下

这个是一些区间 轮流选。当前选的不能和之前的区间有交集。。
感觉就是一个区间dp 。。递归的赶脚。

#include 
using namespace std;
#define int long long
#define ll __int128_t
#define ar array<int, 2>
#define arr array<int, 3>
int  n, m, k, inf = 1LL << 61, mod = 998244353;// 1e9+7;
const int N = 5e5 + 50;
int f[101][101], a[101], b[101];
int dfs(int l, int r) {
	if (l == r)return 0;
	if (~f[l][r])return f[l][r];
	set<int>st;
	for (int i = 1; i <= n; ++i)
		if (l <= a[i] && b[i] <= r) {
			st.insert(dfs(l, a[i])^dfs(b[i], r));
		}
	int mex = 0;
	while (st.count(mex))++mex;
	return f[l][r] = mex;
};
void solve() {
	cin >> n;
	for (int i = 1; i <= n; ++i)
		cin >> a[i] >> b[i];
	memset(f, -1, sizeof f);
	cout << (dfs(0, 100)  ? "Alice" : "Bob") << '\n';
};


//一人一世界。。
//如果我来选 肯定选那种 交集多的那些中间区间。。无脑选。。

// https://drken1215.hatenablog.com/entry/2021/06/19/224100






signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout << fixed << setprecision(15);
#ifdef DEBUG
	freopen("../1.in", "r", stdin);
#endif
	//init_f();
	//init();
	//expr();
	int T; cin >> T; while (T--)
		solve();
	return 0;
}



你可能感兴趣的:(算法)