CodeCraft-21 and Codeforces Round 711 (Div. 2) F. Christmas Game【阶梯博弈、换根 DP】

这道题目是比较经典的树上阶梯博弈。

设一个点的深度是depi,如果两个点i,j满足depidepjmodk,则两个点对答案的影响是完全独立的。

我们可以把图拆分为k部分,并且按照原图中的祖先关系把新图连接为k棵树。对于一个点i,在新图中的深度为depi=depik。考虑只有当depi为奇数时才会对答案有影响。对于任意偶数深度的点,如果先手把他移动到偶数深度,后手一定可以通过一步操作把他重新移动到偶数深度。这一步的思考过程就是阶梯博弈。

我们可以通过DFS求出一个点做根的解,但是本题要求的是每一个点做根。对于这类题目考虑换根 DP。

f[i][j][l],表示以i为子树,jdepmodk,ldeplmod2,然后进行换根 DP。换根的时候,只有当j=k1时,l才会发生变化。

#include <bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; #define int i64 using vi = vector<int>; using pii = pair<int, int>; const i32 inf = INT_MAX / 2; const int mod = 1e9 + 7; vi a; vector<vi> e; vector<vector<vi>> g; int k; void dfs(int x, int fa) { g[x][0][0] = a[x]; for (auto y: e[x]) { if (y == fa)continue; dfs(y, x); for (int j = 0; j < k; j++) for (int l = 0; l < 2; l++) { int nj = j, nl = l; nj++; if (nj == k) nj = 0, nl ^= 1; g[x][nj][nl] ^= g[y][j][l]; } } return; } void dp(int x, int fa) { if (x != 1) { auto tmp = g[fa]; for (int j = 0; j < k; j++) { for (int l = 0; l < 2; l++) { int nj = j + 1, nl = l; if (nj == k) nj = 0, nl ^= 1; tmp[nj][nl] ^= g[x][j][l]; } } for (int j = 0; j < k; j++) for (int l = 0; l < 2; l++) { int nj = j + 1, nl = l; if (nj == k) nj = 0, nl ^= 1; g[x][nj][nl] ^= tmp[j][l]; } } for (auto y: e[x]) { if (y == fa) continue; dp(y, x); } return; } i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int n; cin >> n >> k; e = vector<vi>(n + 1); for (int i = 1, x, y; i < n; i++) { cin >> x >> y; e[x].push_back(y); e[y].push_back(x); } a = vi(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; g = vector(n + 1, vector(k, vi(2))); dfs(1, -1), dp(1, -1); for (int i = 1, sg; i <= n; i++) { sg = 0; for (int j = 0; j < k; j++) sg ^= g[i][j][1]; cout << (sg != 0) << " "; } return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/18546060.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2023-11-14 AtCoder Beginner Contest 325
2022-11-14 2022 SMU-XCPC 集训队新生赛
点击右上角即可分享
微信分享提示