題目傳送門
題意:在乙個有n個結點n-1條邊的樹狀的網路中,鍵盤俠a和鍵盤俠b一起移動,兩個人輪流選擇乙個當前結點的相鄰結點移動,每個結點至多被經過一次,當沒有可以移動的結點的時候旅途結束,到達結點i後兩個人獲得的金幣為a[i]-b[i],鍵盤俠a想讓最終結果金幣盡可能多,b想讓最終結果金幣盡可能少,第一輪由a任選乙個結點作為起點,求最終的結果(a肯定會選擇乙個能使最終結果最大的結點作為起點啦~)
題解:顯然為樹形dp+換根。注意一些實現細節就行了
#include
using
namespace std;
//#define debug(x) cout<<#x<<" is "long
long ll;
const
int maxn=
1e5+5;
const ll inf=
1e16
;struct edgee[maxn<<1]
;int cnt,head[maxn]
;ll ac,a[maxn]
,b[maxn]
,dp[2]
[maxn]
,siz[maxn]
;void
adde
(int x,
int y)
void
dfs1
(int x,
int f)
if(dp[0]
[x]==
-inf)dp[0]
[x]=0;
if(dp[1]
[x]==inf)dp[1]
[x]=0;
dp[0]
[x]+
=a[x]
-b[x]
; dp[1]
[x]+
=a[x]
-b[x];}
void
dfs2
(int x,
int f)
else
if(dp[0]
[v2]
<=tle[1]
[0])
else
}for
(int i=head[x]
;i!=-1
;i=e[i]
.nex)
else
if(dp[0]
[v]!=tle[1]
[0])
else
if(dp[0]
[x]==
-inf)dp[0]
[x]=0;
if(dp[1]
[x]==inf)dp[1]
[x]=0;
dp[0]
[x]+
=a[x]
-b[x]
; dp[1]
[x]+
=a[x]
-b[x];if
(siz[v]
>
1)dp[0]
[v]=
max(dp[0]
[v],dp[1]
[x]+a[v]
-b[v]);
else dp[0]
[v]=dp[1]
[x]+a[v]
-b[v];if
(siz[v]
>
1)dp[1]
[v]=
min(dp[1]
[v],dp[0]
[x]+a[v]
-b[v]);
else dp[1]
[v]=dp[0]
[x]+a[v]
-b[v]
;dfs2
(v,x)
; dp[0]
[x]=xx;
dp[1]
[x]=yy;
dp[0]
[v]=xx2;
dp[1]
[v]=yy2;}}
intmain()
dfs1(1
,-1)
;dfs2(1
,-1)
;printf
("%lld\n"
,ac);}
return0;
}
杭電多校第八場
1003 題目鏈結 clockwise or counterclockwise 水題,經歷過牛客應該知道叉積可以判斷順逆時針。叉積參考 叉積 參考 include include include include include include include include include incl...
2019杭電多校第八場
感覺慢慢陷入了疲態 依舊是努力簽到的一天 1009 calabash and landlord 各種分類討論,交上去,wa,造資料,找到bug,改一改,交上去,wa,造資料,改一改,wa,改一改,wa 迴圈多次後ac,然後自己也不知道自己寫的是個啥了。後來聽群裡老哥們說只要離散化到5 5的格仔裡然後...
杭電多校2020第八場
isomorphic strings 題意 兩個字串s,t互為cyclical isomorphic,當且僅當s將前x個字元移到末尾後,s與t想等,例如s abcde,t deabc,那麼s和t互為cyclical isomorphic。給定乙個s串,長度為n,k為n的因子,現在將s分成k個等長的字...