列表

详情


NC237115. Christmas Game

描述

Alice 和 Bob 在一棵 n 个点的树上玩游戏,第 i 个节点上有 a_i 个石子,每轮可以选择一个深度至少为 k 的节点并移动任意多石子到其 k 级祖先处,对每个结点询问如果将其作为根谁会赢。

输入描述

第一行输入两个整数 n, k (; )。
接下来 n-1 行,每行两个整数 x, y ()。
接下来一行包含 n 个整数 a ()。

输出描述

输出 n 个数,第 i 个数表示,以 i 为节点的树,如果 Alice 获胜,输出 1,否则输出 0

示例1

输入:

5 1
1 2
1 3
5 2
4 3
0 3 2 4 4

输出:

1 0 0 1 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 191ms, 内存消耗: 24852K, 提交时间: 2023-07-22 11:16:24

#include <bits/stdc++.h>
#define rep(i,a,b)for(int i = (a); i < (b); i++)
#define _for(i,a,b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 1e5 + 10;
int dp[N][45], sg[N], a[N], n, k;
vector<int> g[N];
void dfs(int u, int fa)
{
    dp[u][0] = a[u];
    for(int v: g[u])
    {
        if(v == fa) continue;
        dfs(v, u);
        rep(j, 0, k) dp[u][(j + 1) % k] ^= dp[v][j];
    }
}
void dfs2(int u, int fa)
{
    _for(i, k / 2, k - 1) sg[u] ^= dp[u][i];
    for(int v: g[u])
    {
        if(v == fa) continue;
        rep(j, 0, k) dp[u][(j + 1) % k] ^= dp[v][j];
        rep(j, 0, k) dp[v][(j + 1) % k] ^= dp[u][j];
        dfs2(v, u);
        rep(j, 0, k) dp[v][(j + 1) % k] ^= dp[u][j];
        rep(j, 0, k) dp[u][(j + 1) % k] ^= dp[v][j];
    }
}
int main()
{
    scanf("%d%d", &n, &k);
    k *= 2;
    _for(i, 1, n - 1)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    _for(i, 1, n) scanf("%d", &a[i]);

    dfs(1, 0);
    dfs2(1, 0);
    _for(i, 1, n) printf("%d ", sg[i] > 0);
}

上一题