CF1498F Christmas Game
problem
一棵树,有root,一个点只能向根跳k步直到不能走,问先手必败还是必胜。
root从1到n,回答n次
solution
一次的话就是一个阶梯nim。
多次的话,就要换根。
换根的话,虽然会全局影响,但是对答案没啥影响。
tips
这里的dp是dp[n][2k]不是dp[n][k]][0/1]
code
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
const int _=1e6+7;
// const int mod=1e9+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
vector<int> g[_];
int dep[_],a[_],n,k,f[_][44],ans[_];
void dfs_init(int u,int fa) {
dep[u]=dep[fa]+1;
f[u][0]=a[u];
for(auto v:g[u]) {
if(v==fa) continue;
dfs_init(v,u);
for(int i=0;i<2*k;++i) {
f[u][i]^=f[v][(i-1+2*k)%(2*k)];
}
}
}
void dfs(int u,int fa) {
// cout<<u<<" "<<fa<<"!\n";
for(int i=k;i<2*k;++i) ans[u]^=f[u][i];
for(auto v:g[u]) {
if(v==fa) continue;
array<int,40> uu,vv;
for(int i=0;i<2*k;++i) {
uu[i]=f[u][i];
vv[i]=f[v][i];
}
for(int i=0;i<2*k;++i) {
f[u][i]^=f[v][(i-1+2*k)%(2*k)];
}
for(int i=0;i<2*k;++i) {
f[v][i]^=f[u][(i-1+2*k)%(2*k)];
}
dfs(v,u);
for(int i=0;i<2*k;++i) {
f[u][i]=uu[i];
f[v][i]=vv[i];
}
}
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
#endif
n=read(),k=read();
for(int i=1;i<n;++i) {
int x=read(),y=read();
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;++i) a[i]=read();
int rt=1;
dep[0]=-1;
dfs_init(rt,0);
dfs(rt,0);
for(int i=1;i<=n;++i) cout<<(bool)ans[i]<<" ";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)