HDU6567 樹重心模板練習題

2021-09-29 11:46:21 字數 1588 閱讀 5068

傳送門

題意:給你兩棵樹,讓你把這兩顆樹連線起來,要求連線起來的樹的任意兩個節點的距離最小

題解:樹重心模板訓練題,找到這兩顆樹的樹重心,然後連線,最後求一次,樹中所有路徑的長度。

ps:因為沒顆樹的節點數是不清楚的,只有找到樹的節點數才能dp找到樹重心,所以要在重心之前dfs一遍找樹大小,這裡也可用並查集來實現。筆者在這裡wa了10發。。。。

ps2:ac-code 所用到的板子傳送門

ac-code

#include

using namespace std;

const

int mx =

2000000+7

;typedef

long

long ll;

typedef

unsigned

long

long ull;

vector ve[mx]

;int f[mx]=;

ll d[mx]

=,e[mx]

=,n;

ll minnode =

0,minnoden=

1e18+7

;ll sum =0;

ll ans=0;

void

ddd(

int u,

int fa)

}void

dfs(

int u,

int fa,

int s)

} masub =

max(masub,s-d[u]);

//主要用來防止一條鏈的情況,看看父親的情況

if(minnoden>masub)

}void

ansdfs

(int rt,

int fa)

} ans +

= e[rt]

*(n-e[rt]);

}int

main()

ddd(1,

0);memset

(d,0

,sizeof

(d))

; ll s = sum;

minnode =

0, minnoden =

1e18+7

;dfs(1

,0,s);

int root1 = minnode;

minnode =

0, minnoden =

1e18+7

;memset

(d,0

,sizeof

(d))

;int r =2;

for(

int i=

1;i<=n;i++)}

dfs(r,

0,n-s)

;int root2 = minnode;

ve[root1]

.push_back

(root2)

; ve[root2]

.push_back

(root1)

;ansdfs(1

,0);

cout

}

回文樹練習題

貼 改 模板大集合系列 大概包括了pam的這些問題 1.sz的意義 本質不同的回文子串個數 2.cnt的意義 當前回文子串出現的次數 3.num的意義 靠最右邊的回文子串個數 新加乙個字元產生的回文子串個數 暴力fail的層數 4.half的意義 長度小於等於當前回文子串的一半的回文字尾的節點 5....

線段樹練習題一

線段樹練習題一 description 桌子上零散地放著若干個盒子,桌子的後方是一堵牆。如右圖所示。現在從桌子的前方射來一束平行光,把盒子的影子投射到了牆上。問影子的總寬度是多少?分析 給線段樹每個節點增加乙個域cover。cover 1表示該結點所對應的區間被完全覆蓋,cover 0表示該結點所對...

線段樹練習題二

線段樹練習題二 description 桌子上零散地放著若干個不同顏色的盒子,桌子的後方是一堵牆。如右圖所示。問從桌子前方可以看到多少個盒子?假設人站得足夠遠 輸入時,由底向上,從左到右 分析 cover 0表示該區間由多種顏色組成。cover 0表示該區間只有一種單一的顏色cover,最後用個桶統...