社区讨论
萌新袜子求助关于本题的线性做法(悬赏自提)
P6665[清华集训 2016] Alice 和 Bob 又在玩游戏参与者 4已保存回复 18
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 18 条
- 当前快照
- 1 份
- 快照标识符
- @mj8q2qs6
- 此快照首次捕获于
- 2025/12/16 23:13 2 个月前
- 此快照最后确认于
- 2025/12/19 23:20 2 个月前
如题,我在做 QOJ9605(本题的线性空间版本)的时候发现了一种时空复杂度均为 的做法,询问 U 群后未能得到该做法的解释。
本题同时也是 https://ac.nowcoder.com/acm/contest/23218/F。
其中 Tony 老师的做法就是本做法。
QOJ9605 的提交记录按空间排序的前列也有。
CPPint z=lowbit((~x[i])&(~y[i]));
x[i]=(x[i]/z+1)*z;
if(y[i]&z)y[i]|=z-1;
else y[i]=(y[i]/z+1)*z;
if(i>1) x[fa[i]]^=x[i],y[fa[i]]|=y[i];
还有另一份重写过的能做到本题最优解的代码。
CPPint T, n, m, f[maxn], g[maxn], vis[maxn], ans; vec<int> e[maxn];
void dfs(int u, int fa) {
vis[u] = 1;
for (int v : e[u]) if (v != fa) dfs(v, u), f[u] ^= f[v], g[u] |= g[v];
int x = (g[u] + 1) & ~g[u];
f[u] &= -x, f[u] |= x; ++g[u];
}
void solve() {
scanf("%d%d", &n, &m);
rep(i, 1, n) f[i] = g[i] = vis[i] = 0, e[i].clear(); ans = 0;
for (int i = 1, x, y; i <= m; i++) scanf("%d%d", &x, &y), e[x].pb(y), e[y].pb(x);
rep(i, 1, n) if (!vis[i]) dfs(i, 0), ans ^= f[i];
puts(ans ? "Alice" : "Bob");
}
大概是这样,其中 或者 是 SG 值, 或者 的含义本人未能得到解答。
求有没有博弈论大手子能给出一份解释或者说这个做法的题解链接/kel
回复
共 18 条回复,欢迎继续交流。
正在加载回复...