codeforces686D(樹的重心)

2021-08-04 15:29:15 字數 626 閱讀 1074

題意:求出以每個點為子樹的重心。

思路:可以利用重心的性質,某乙個點的重心在最大的點那個子樹上,並且在在這個節點到最大子樹的重心之間,重心滿足num[x] * 2 > num[u],x為重心,u為要求重心的節點,num代表這個節點的子樹的節點個數。

#includeusing namespace std;

typedef pairp;

const int maxn = 300000 + 10;

typedef long long ll;

vectorg[maxn];

int fa[maxn];

int num[maxn];

int ans[maxn];

void dfs(int u)

if(num[u] == 1 || num[u] == 2)

int x= ans[pos];

while(num[x] * 2 < num[u])

x = fa[x];

ans[u] = x;

}int main()

dfs(1);

for(int i = 1; i <= m; i ++)

}return 0;

}

CodeForces 686D 樹的重心

傳送門 題意 給你n個節點,其中1為根,第二行給你2 n的節點的父親節點編號。然後是q個詢問,求詢問的節點為根的重心的節點編號。思路 利用樹的重心的乙個性質 樹的重心在 根節點 和 根節點的最大子結點的重心 之間。並且2 cnt v cnt u u為根節點,v為重心 include includeu...

Codeforces 755D(思維 線段樹)

從x到x k點,其實只要求從x到x k之間的點有多少條線超過x x k這條線就行,一開始直接暴力,就時間超時了,而用線段樹維護就快多了。1 include 2 using namespace std 3 typedef long long ll 4 define n 1000010 5 define...

codeForces 472D 最小生成樹

題目大意 給出乙個圖中點的兩兩距離,問是否是一棵樹,若是,求出平均邊權最大的點 prim最小生成樹,若原圖是樹,則最小生成樹的距離就是原距離。否則不是。搞出來樹了,第二問隨便dfs就好了。include include include include include define n 2550 us...