杭電多校第八場1006 樹形dp 換根

2021-09-26 05:10:08 字數 2094 閱讀 2230

題目傳送門

題意:在乙個有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個等長的字...