hdu 6106 Classes (二分)
生活随笔
收集整理的這篇文章主要介紹了
hdu 6106 Classes (二分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
怎么說呢,多校看完題解總讓你感覺難度還可以,不算大,題解能看懂,讓你自己做呢,這題什么意思?怎么辦?什么思路?也許這就是多校的魅力和意義所在,還好有很多人都不會,看了題解就開始瘋狂補題。首先這個題我沒看懂意思,我以為是bob的特權是可以選擇和A互換誰先涂色,以為是一道很難的dp,看到很多人做出來,也沒仔細讀下題,其實是可以選擇讓當前涂色的是否影響其他區域。
題解一說是二分很容易想到題解的正確性,讓我自己想出來,感覺不存在的
- 如果Bob能把這棵樹分成若干兩個一組的點對,那么Bob取得勝利,否則Alice獲勝。
- 如果原樹不存在兩兩匹配的方案,Alice從樹葉開始,每次都染樹葉父節點,Bob被迫只能不斷的染葉子,Bob退化成一般玩家,因為Bob做不做小動作都不會逆轉局勢,總會出現一個時間點Bob沒辦法跟上Alice的節奏而讓Alice染到一個周圍都已被染色的孤立點(因為原樹不存在兩兩匹配的方案)
- 如果原樹存在兩兩匹配的方案,而且Bob的小動作次數也足以把原樹分成兩兩的點對,那么Bob顯然獲勝。
- 如果原樹存在兩兩匹配的方案,而Bob的小動作不足以把樹分成兩兩的點對,Alice一定獲勝,因為每次染某個葉子節點(該節點為其父節點的唯一子節點),Alice總能迫使Bob不斷的做小動作以保證剩下的樹不會出現奇數節點的樹,且每次小動作割出一個點對(包含Alice剛染的點),最后有兩種情況。
- 出現某個結點有>=2個子節點為葉子節點。Alice染這個點,Bob跟不上Alice的節奏,出現孤點,Ailice取勝
- 否則整個過程一定會持續到樹被染光或者Bob被Alice掏空導致做不了小動作進而被迫割出一塊size為奇數的子樹(這棵樹顯然沒辦法兩兩匹配)而敗北。
- Bob被允許“任意時刻”做小動作看似很厲害其實很雞肋,把問題改成“Bob只能在游戲開始之前做小動作”會得到同樣的結論。
- “氪不改命,玄不救非”
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; #define eps 1e-8 vector<int>g[505]; int flag=0; void dfs(int u) {int num=0;for(int i=0; i<g[u].size(); i++){int v=g[u][i];if(g[v].size()==0)num++;if(num>=2){flag=1;return ;}dfs(v);} } int main() {int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);int x;flag=0;for(int i=1; i<=n; i++)g[i].clear();for(int i=2; i<=n; i++){scanf("%d",&x);g[x].push_back(i);}dfs(1);if(n&1||flag==1||n/2-1>k){printf("Alice\n");}else printf("Bob\n");}return 0; }
總結
以上是生活随笔為你收集整理的hdu 6106 Classes (二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 车联网通信安全之 SSL/TLS 协议
- 下一篇: 网络摄像头工作原理_好,更好,最好以预算