Game on Tree
1.P8784 [蓝桥杯 2022 省 B] 积木画2.P9847 [ICPC2021 Nanjing R] Crystalfly3.G. Vlad and Trouble at MIT4.P2899 [USACO08JAN] Cell Phone Network G5.P5322 [BJOI2019] 排兵布阵6.P2946 [USACO09MAR] Cow Frisbee Team S7.P1156 垃圾陷阱8.P1064 [NOIP2006 提高组] 金明的预算方案9.P2466 [SDOI2008] Sue 的小球10.P5020 [NOIP2018 提高组] 货币系统11.P1757 通天之分组背包12.P2135 方块消除13.D - String Bags14.P4395 [BOI2003] Gem 气垫车15.A - A Multiply16.P2642 双子序列最大和17.P1121 环状最大两段子段和18.P2422 良好的感觉19.P2854 [USACO06DEC] Cow Roller Coaster S20.C. Theofanis' Nightmare21.D. Birthday Gift22.P1284 三角形牧场23.P1353 [USACO08JAN] Running S24.P8736 [蓝桥杯 2020 国 B] 游园安排25.P1470 [USACO2.3] 最长前缀 Longest Prefix26.P7859 [COCI2015-2016#2] GEPPETTO27.P1435 [IOI2000] 回文字串28.P2340 [USACO03FALL] Cow Exhibition G29.P1854 花店橱窗布置30.P3147 [USACO16OPEN] 262144 P
31.Game on Tree
32.P2938 [USACO09FEB] Stock Market G33.P9691 [GDCPC2023] Base Station Construction34.P8624 [蓝桥杯 2015 省 AB] 垒骰子35.E. Money Buys Happiness36.P8675 [蓝桥杯 2018 国 B] 搭积木37.P8774 [蓝桥杯 2022 省 A] 爬树的甲壳虫38.P8806 [蓝桥杯 2022 国 B] 搬砖39.P5662 [CSP-J2019] 纪念品40.B. Mashmokh and ACM41.C. Minimizing the Sum42.H. Don't Blame Me43.D. Bicolorings44.D. Armchairs45.C. Chef Monocarp46.D. Invertible Bracket Sequences47.P1351 [NOIP2014 提高组] 联合权值48.D. World is Mine49.F. Feed Cats50.P3522 [POI2011] TEM-Temperature51.P3572 [POI2014] PTA-Little Bird52.P3089 [USACO13NOV] Pogo-Cow S53.E - Maximum Glutton54.Projects55.Elevator Rides题解
easy.ver::只能朝一个方向走,还剩奇数个格子时先手获胜
medium.ver: 令
hard.ver: 考虑沿用medium的想法,并用换根法(因为当前节点只和子节点有关)
假如已知以节点
那么对于其子节点
则 不会变 则 但是如果 只有 一个节点0,那么此时修改 不然不变
code
#include<bits/stdc++.h>
using namespace std;
vector<int> G[200005];
int dp[200005]={0};
int cnt[200005]={0};
int ans[200005]={0};
void dfs(int now,int fa)
{
for(auto next:G[now])
{
if(next==fa) continue;
dfs(next,now);
dp[now]|=(1-dp[next]);//dp[now] 的意思是当以now为根的树,且now节点已经有一颗棋(其子节点均还没有)时,先手必胜1还是必败0
cnt[now]+=(1-dp[next]);
}
}
void alter(int now,int fa)
{
ans[now]=dp[now];
int temdp=dp[now],temcnt=cnt[now];
for(auto next:G[now])
{
if(next==fa) continue;
if(dp[now]==0) cnt[next]++;
else if(dp[now]==1)
{
if(dp[next]==0)
{
if(cnt[now]==1)
{
dp[now]=0;
dp[next]=1;
cnt[next]++;
}
cnt[now]--;
}
}
alter(next,now);
dp[now]=temdp;
cnt[now]=temcnt;//这个复原工作充分体现了本次换根法的当前节点只与其相邻节点有关
}
}
int main()
{
int n,t;
cin>>n>>t;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,1);
alter(1,1);
while(t--)
{
int x;
cin>>x;
puts(ans[x]?"Ron":"Hermione");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本