NOIP2023模拟3联测24-博弈树
NOIP2023模拟3联测24-博弈树
题目大意
思路
显然一棵树的最长路就是直径,所以当一个人走了与直径一样长的路径的时候必胜。
现在我们假设这棵树形成了一条链,显然只有在这条链的长度是奇数且起始点在中点时先手才必败,否则先手必胜。
我们开始不断删点,每次把当前树的直径的端点删掉,如果最后能够剩下一个点,那么先手必败,否则先手必胜。
我们发现这个最后剩下的那个点一定是原树上所有直径的交点,也是他们的中点。
所以只要只有在这个树的直径是奇数且起始点在直径的中点时先手才必败,否则先手必胜。
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
const int N = 1e5 + 5;
int fa[N] , n , q , dep[N] , dis[N] , hd[N] , cnt , d , ans[N];
struct E {
int to , nt;
} e[N << 1];
void add (int x , int y) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt; }
void dfs1 (int x) {
int y;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
if (y == fa[x]) continue;
dep[y] = dep[x] + 1;
fa[y] = x;
dis[y] = dis[x] + 1;
dfs1 (y);
}
}
void dfs2 (int x , int lst) {
int y;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
if (y == lst) continue;
dis[y] = dis[x] + 1;
dfs2 (y , x);
}
}
void solve (int x , int y) {
int sum1 = 1 , sum2 = d;
if (dep[x] < dep[y]) swap (x , y);
while (dep[x] != dep[y]) {
ans[sum1] = x;
sum1 ++;
x = fa[x];
}
if (sum1 == d) return;
while (x != y) {
ans[sum1] = x;
ans[sum2] = y;
sum1 ++;
sum2 --;
x = fa[x];
y = fa[y];
}
if (d & 1) ans[sum1] = x;
}
int main () {
freopen ("tree.in" , "r" , stdin);
freopen ("tree.out" , "w" , stdout);
int u , v;
scanf ("%d%d" , &n , &q);
if (n == 1) {
while (q --) puts ("Bob");
return 0;
}
fu (i , 1 , n - 1) {
scanf ("%d%d" , &u , &v);
add (u , v) , add (v , u);
}
dfs1 (1);
int max1 = 0 , pos1 , pos2;
fu (i , 1 , n) {
if (max1 < dis[i]) {
max1 = dis[i];
pos1 = i;
}
}
memset (dis , 0 , sizeof (dis));
dfs2 (pos1 , 0);
max1 = 0;
fu (i , 1 , n) {
if (max1 < dis[i]) {
max1 = dis[i];
pos2 = i;
}
}
d = max1 + 1;
solve (pos1 , pos2);
int mid = ans[d / 2 + 1];
while (q --) {
scanf ("%d" , &pos1);
if (d & 1 && pos1 == mid) puts ("Bob");
else puts ("Alice");
}
}
如果人生会有很长,愿有你的荣耀永不散场
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端