日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

省队集训Day3 tree

發(fā)布時(shí)間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 省队集训Day3 tree 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【題目描述】
RHL 有一天看到 lmc 在玩一個(gè)游戲。
“愚蠢的人類喲,what are you doing”,RHL 說(shuō)。
“我在玩一個(gè)游戲。現(xiàn)在這里有一個(gè)有 n 個(gè)結(jié)點(diǎn)的有根樹,其中有 m 個(gè)葉子結(jié)點(diǎn)。這 m
個(gè)葉子從 1 到 m 分別被給予了一個(gè)號(hào)碼,每個(gè)葉子的號(hào)碼都是獨(dú)一無(wú)二的。一開(kāi)始根節(jié)點(diǎn)有
一個(gè)棋子,兩個(gè)玩家每次行動(dòng)將棋子移動(dòng)到當(dāng)前節(jié)點(diǎn)的一個(gè)兒子節(jié)點(diǎn)。當(dāng)棋子被移動(dòng)到某個(gè)
葉節(jié)點(diǎn)的時(shí)候游戲結(jié)束,這個(gè)葉節(jié)點(diǎn)的號(hào)碼即為該局游戲的 result。先手的玩家要最大化
result,后手的玩家要最小化這個(gè) result。”
“你不先問(wèn)一下我是誰(shuí)嗎 = =”
“那么,who are you”
“我是這個(gè)世界的創(chuàng)造者,維護(hù)者和毀滅者,整個(gè)宇宙的主宰,無(wú)所不知,無(wú)所不能的,
三個(gè)字母都大寫的 RHL。”
“既然你這么厲害,那你一定知道,在兩個(gè)玩家都無(wú)限聰明的情況下,在樹的形態(tài)已知
的情況下,在葉子的編號(hào)可以任意安排的情況下,游戲的 result 最大是多少咯。”
【輸入格式】
輸入數(shù)據(jù)第一行有一個(gè)正整數(shù) n,表示結(jié)點(diǎn)的數(shù)量。
接下來(lái) n-1 行,每行有兩個(gè)正整數(shù) u 和 v,表示的父親節(jié)點(diǎn)是 u。
【輸出格式】
輸出一行 2 個(gè)非負(fù)整數(shù),分別表示 result 的最大值和最小值。
【樣例輸入】
5
1 2
1 3
2 4
2 5
【樣例輸出】
3 2
【樣例解釋】
有 3,4,5 三個(gè)葉子。若令 3 號(hào)葉子的編號(hào)是 3,則先手可以移到 3 號(hào)結(jié)點(diǎn),故 result
最大是 3。若 3 號(hào)葉子的編號(hào)是 2,則先手可以移到 3 號(hào)結(jié)點(diǎn),故 result 最小是 2.
【數(shù)據(jù)范圍】
30%,n<=10
100%,n<=200000

?

一道tree DP題·····

只考慮最大值的情況,即為A來(lái)編號(hào)。

設(shè)sum[u]表示以u(píng)為根的子樹有sum[u]個(gè)葉子節(jié)點(diǎn),f[u]表示A先手時(shí)的最好方案,g[u]表示B先手時(shí)的最好方案

對(duì)于f[u],設(shè)v為u的兒子,則f[u]=max( sum[u]-(sum[v]-g[v]+1)+1 )

對(duì)于g[u],則g[u]=sum[u]-sigma(sum[v]-f[v]+1)+1

最小值同理

?

code:

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 200005 6 #define inf maxn+10 7 using namespace std; 8 int n,a,b,tot,root,now[maxn],son[maxn],pre[maxn],sum[maxn],f[maxn][2],g[maxn][2]; 9 bool bo[maxn],ok[maxn]; 10 void put(int a,int b){pre[++tot]=now[a],now[a]=tot,son[tot]=b;} 11 void dfs(int u){ 12 if (!bo[u]){f[u][0]=f[u][1]=g[u][0]=g[u][1]=sum[u]=1;return;} 13 for (int p=now[u],v=son[p];p;p=pre[p],v=son[p]) dfs(v),sum[u]+=sum[v]; 14 int s1=0,s2=0; 15 for (int p=now[u],v=son[p];p;p=pre[p],v=son[p]){ 16 f[u][0]=max(f[u][0],sum[u]-sum[v]+g[v][0]); 17 g[u][1]=min(g[u][1],f[v][1]); 18 s1+=sum[v]-f[v][0]+1,s2+=g[v][1]; 19 } 20 g[u][0]=sum[u]-s1+1,f[u][1]=s2; 21 } 22 int main(){ 23 freopen("tree.in","r",stdin),freopen("tree.out","w",stdout); 24 scanf("%d",&n); 25 for (int i=1;i<n;i++) scanf("%d%d",&a,&b),put(a,b),bo[a]=1,ok[b]=1; 26 for (int i=1;i<=n;i++) if (!ok[i]) root=i; 27 for (int i=1;i<=n;i++) g[i][1]=inf; 28 dfs(root); 29 printf("%d %d\n",f[root][0],f[root][1]); 30 return 0; 31 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/chenyushuo/p/4622567.html

總結(jié)

以上是生活随笔為你收集整理的省队集训Day3 tree的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。