【Codeforces1404B】Tree tag | 樹上追擊、博弈、樹的直徑
題目連結:https://codeforces.com/contest/1404/problem/B
題目大意:
Aiice和Bob在一棵樹上,初始Alice在a點 , Bob在b點,Alice可以一次走da步,Bob可以一次走db步,Alices先走,詢問Alices是否能追上Bob
題目思路:
首先很明確的一點:
如果從Alices為根的樹,Bob的深度小於等於da那麼Alice必贏
其次考慮如果da*2 >= mx(樹的直徑),那麼就表明Alice走完第一步之後就可以到達任何點,所以此時Alice也必贏
所以就考慮da與db的關係了
如果2*da >= db:
因為Alice先走,所以此時Alice肯定會把Bob逼到一個死衚衕裡,因為此時db小於等於2*da,所以Bob只能逃跑,而不能迎面衝鋒
如果2*da < db:
那麼此時Bob就可以變聰明瞭,因為第一次到達不了Bob,所以說當Alice距離Bob小於da時,Bob就可以反向走,跳到另一邊,因為此時db > 2*da 所以現在距離還是大於da,所以Bob可以一直繞圈子!
Code:
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll INF= 1e16;
const int maxn = 1e6+7;
const int mod= 998244353;
inline bool read(ll &num)
{char in;bool IsN=false;
in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
ll n,m,p;
ll a,b,da,db;
ll s[maxn],t[maxn];
vector<int>v[maxn];
int deep[maxn];
ll ans = 0;
ll dfs(int u,int fa){
ll res=1;
ll maxl=0;
deep[u] = deep[fa] + 1;
for(int e:v[u]){
if(e==fa) continue;
ll temp=dfs(e,u);
ans=max(ans,temp+maxl+1);
maxl=max(maxl,temp);
res=maxl+1;
ans=max(res,ans);
}
return res;
}
int main()
{
int T;scanf("%d",&T);
while(T--){
read(n);read(a);read(b);read(da);read(db);
for(int i=1;i<=n;i++) v[i].clear();
for(int i=1;i<=n-1;i++){
int x,y;scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
ans = 0;
deep[a] = -1;
dfs(a,a);
ans--;
if(deep[b]<=da) printf("Alice\n");
else if(2*da>=ans) printf("Alice\n");
else if(2*da>=db) printf("Alice\n");
else printf("Bob\n");
}
return 0;
}/***
2
7 4 4
ABCFBFF
1 2
2 3
6 5
4 5
5 F
7 B
6 B
1 B
***/
相關文章
- 樹的直徑
- D52 樹的直徑+貪心 CF911F Tree DestructionStruct
- Codeforces 455C Civilization:樹的直徑 + 並查集【合併樹後直徑最小】並查集
- 演算法筆記 - 樹的直徑演算法筆記
- 二叉樹最大距離(直徑)二叉樹
- 路徑上若干條樹的包含
- 【模板題】 543. 二叉樹的直徑二叉樹
- D48 樹的直徑 P3304 [SDOI2013] 直徑
- 兩個需要求 sg 函式的樹上博弈問題函式
- dsu on tree (樹上啟發式合併) 詳解
- 257. Binary Tree Paths(列印二叉樹所有路徑)二叉樹
- hdu 4836 The Query on the Tree(線段樹or樹狀陣列)陣列
- 『資料結構』樹(Tree)資料結構
- LeetCode第 543 題:二叉樹的直徑(C++)LeetCode二叉樹C++
- Codeforces 337D Book of Evil:樹的直徑【結論】
- LayUI—tree樹形結構的使用UI
- 多路查詢樹:B-tree/b+tree
- 樹上染色(樹形dp)
- leetcode 每日一題 543 二叉樹的直徑 dfs方法LeetCode每日一題二叉樹
- 改造layui-樹(tree)元件支援樹的關鍵字搜尋操作UI元件
- js資料結構--樹(tree)JS資料結構
- 抽象語法樹 Abstract syntax tree抽象語法樹
- 淺談線段樹(Segment Tree)
- [CareerCup] 4.8 Contain Tree 包含樹AI
- 平衡樹索引(b-tree index)索引Index
- 線段樹入門(Segment Tree)
- B樹(B-tree, 平衡的多路查詢樹)的相關知識
- SAP RETAIL 特性樹(Characteristic Tree)的定義AI
- php tree類的使用(樹形結構)PHP
- HDU 4123 Bob's Race:樹的直徑 + 單調佇列 + st表佇列
- D49 樹的直徑 P2491 [SDOI2011] 消防
- 【LeetCode擊敗99%+】二叉樹路徑總和LeetCode二叉樹
- 攻擊樹測試
- Java將List集合組裝成樹(Tree)樹結構組裝Java
- 大資料————決策樹(decision tree)大資料
- POJ 2486 Apple Tree(樹形dp)APP
- What is a Parse Tree? 什麼是解析樹
- 8 個最好的 jQuery 樹形 Tree 外掛jQuery