首页 > 其他分享 >CodeCraft-21 and Codeforces Round 711 (Div. 2) F. Christmas Game【阶梯博弈、换根 DP】

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

时间:2024-11-14 16:08:53浏览次数:1  
标签:nj nl 21 int ++ CodeCraft Codeforces dep vector

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

设一个点的深度是\(dep_i\),如果两个点\(i,j\)满足\(dep_i\not\equiv dep_j \mod k\),则两个点对答案的影响是完全独立的。

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

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

记\(f[i][j][l]\),表示以\(i\)为子树,\(j \equiv dep \mod k, l \equiv \left\lfloor \frac{dep'}{l} \right\rfloor \mod 2\),然后进行换根 DP。换根的时候,只有当\(j=k-1\)时,\(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;
}

标签:nj,nl,21,int,++,CodeCraft,Codeforces,dep,vector
From: https://www.cnblogs.com/PHarr/p/18546060

相关文章

  • B. Alice's Adventures in Permuting (python解)-codeforces
    B.Alice'sAdventuresinPermuting(python解)-codeforces原题链接:B.Alice'sAdventuresinPermuting问题分析:我们需要将数组a转换为一个排列,排列是由n个不同的整数构成,范围从0到n−1。数组a是通过给定的参数n、b和c生成的。\[a[i]=b⋅(i−1)+c\]\[对于1≤i......
  • 关于我重生到21世纪学C语言这件事——操作符详解
    与诸君共进步!!!还有你,也要加油!文章目录1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符5.位操作符:&、|、^、~6.单⽬操作符7.逗号表达式8.下标访问[]、函数调⽤()9.结构成员访问操作符10.操作符的属性:优先级、结合性11.表达式求值1.操作......
  • 【Unity着色器插件】Better Lit Shader 2021 增强光照和材质表现,在性能和美观度上做出
    BetterLitShader2021是一款在Unity中广受欢迎的着色器插件,主要用于增强光照和材质表现。它在性能和美观度上做出平衡,非常适合希望在Unity中实现高质量视觉效果的开发者,特别是那些想要获得逼真光照效果的项目。主要功能多光照支持:支持多个光源在场景中同时使用,例如主光......
  • 2021年6月上海月赛T5题解(做基础123题时遇到的)
    平衡点内存限制: 256 Mb时间限制: 1000 ms题目描述给定一个由 n 个整数组成的数列a1​,a2​,⋯,an​,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的力矩尽量接近。若平衡点为 ak​,则左侧力矩定义为数列中下标小于 k 的各个元素到 ak​ 的距离乘以这些元素......
  • [NOI2021] 轻重边
    气死我了这题,还是写一下题解首先有一个非常好的转化,你可以把给定操作转为树上颜色问题假设将操作\(1\)改成“将从\(x\)到\(y\)路径上的所有点都涂上一种新的颜色”,那么可以发现,与路径上的点相邻的所有非路径点,与路径上的点颜色必然不同,路径上的点之间两两必然相同因此就......
  • 2024年美国数学竞赛12年级组A卷P21:合适的一试题
    题目设数列$\{a_n\}$的首项为$a_1=2,$且当$n\geq2$时满足递推关系式$\dfrac{a_n-1}{n-1}=\dfrac{a_{n-1}+1}{(n-1)+1}.$则不大于$\displaystyle{\sum_{n=1}^{100}a_n^2}$的最大整数为 $\textbf{(A)}338550\qquad\textbf{(B)}338551\qquad\textbf{(C)}338552\qqu......
  • NOIP2021 数列
    NOIP2021数列算法一最暴力的爆搜,枚举每个位置所有填值的情况,时间复杂度\(O(n^m)\)。可以拿到20分。算法二没那么暴力的爆搜,注意到填数的具体位置不重要,只关系每种数的出现次数。考虑暴力枚举每个数出现了多少次,记数字\(i\)出现了\(x_i\)次。所求即为下面这个不定方程解......
  • 任推邦邀请码721928:深度评测其使用体验和价值
    任推邦邀请码721928怎么样?行业背景解析在当今数字化、网络化的大背景下,社交媒体和电商平台迅速崛起,为商家和消费者提供了前所未有的互动机会。在这样的环境下,任推邦应运而生,致力于通过创新的技术和服务,帮助商家提升品牌知名度和产品销量。任推邦邀请码721928怎么样?平台功能......
  • Educational Codeforces Round 157 (Rated for Div. 2) - VP 记录
    Preface啊啊啊为什么我老是被简单题卡啊!A.TreasureChestA题题面这么长吓我一跳。分类讨论,钥匙在前面可以拿了钥匙直接到箱子那里;箱子在前面就尽量把箱子往钥匙搬,让折回的距离尽量小。点击查看代码#include<cstdio>#include<algorithm>usingnamespacestd;intmain......
  • P8314 [COCI2021-2022#4] Parkovi
    最大值最小是二分答案的特征。二分完后每个公园可以覆盖距离不超过\(k\)的领域,要覆盖整棵树。二分完后需要check。最可能的路线是贪心和dp。好像本质上都存储了可能成为答案的组合的部分信息,但贪心确定了这个组合当前的唯一性,dp并没有,只能保证最优解一定属于被划分出来的某......