1 条题解
-
0
一、核心结论(直接看这个)
这道题不需要DFS、不需要博弈DP,只靠两个条件就能判断胜负:
设:
- :特殊节点 的度数
- :树的总节点数
最终判定规则
-
如果 本身就是叶子() → 先手 Ayush 直接获胜(第一步就能拿走 )。
-
否则( 不是叶子)
- 若 是奇数 → 后手 Ashish 胜
- 若 是偶数 → 先手 Ayush 胜
二、完整证明(为什么是对的)
1. 特殊情况: 是叶子
- 叶子可以直接被拿走
- 先手第一步直接取 获胜 → Ayush 必胜
2. 一般情况: 不是叶子
想要取到 ,必须先把 周围的点全部删光,让 变成叶子。
这个过程会恰好删除 个节点:
- 总步数由总节点数的奇偶性决定
- 因为两人轮流取,每次取一个点
- 最后一步(取 )的人就是胜者
→ 谁面对偶数个节点谁赢。
三、标程代码解释
#include <bits/stdc++.h> using namespace std; #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); const int N = 2e5 + 5; int n, x; int deg[N]; // 只需要度数,不需要存图 int32_t main() { IOS; int t; cin >> t; while(t--) { memset(deg, 0, sizeof(deg)); cin >> n >> x; // 读边,统计度数 for(int i = 1; i <= n - 1; i++) { int u, v; cin >> u >> v; deg[u]++; deg[v]++; } // 核心逻辑 if(deg[x] <= 1) cout << "Ayush\n"; // x 是叶子,先手直接赢 else { if(n % 2 == 1) cout << "Ashish\n"; // n 奇数,后手赢 else cout << "Ayush\n"; // n 偶数,先手赢 } } return 0; }
四、样例解释
样例 1
输入:
3 1 2-1 3-1- (不是叶子)
- (奇数) → Ashish 胜
样例 2
输入:
3 2 1-2 1-3- (是叶子) → Ayush 直接胜
五、一句话记忆(比赛秒写版)
- x 是叶子 → 先手胜
- 不是叶子
- n 奇 → 后手胜
- n 偶 → 先手胜
- 1
信息
- ID
- 6712
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者