傳送門
題意:給你兩棵樹,讓你把這兩顆樹連線起來,要求連線起來的樹的任意兩個節點的距離最小
題解:樹重心模板訓練題,找到這兩顆樹的樹重心,然後連線,最後求一次,樹中所有路徑的長度。
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,最後用個桶統...