codeforces 791D 樹形dp 所有點對

2021-07-29 12:12:11 字數 531 閱讀 8949

題意:20w個點的樹,邊長都為1,每個點可以往距離不超過k<=5的點進行一次跳躍。求所有的f(a,b)的和,f(a,b)是a到b所需的最小跳躍次數,標號a

題解:樹形dp,a

#include using namespace std;

typedef long long int ll;

ll dp[250000][5];

vectorg[250000];

int k;

ll dists[220000],ans,sons[220000];

void dfs(int x,int fa)

sons[x]+=sons[u];

dists[x]+=dists[u];

dists[x]+=dp[u][k-1];

for(int i=0;i>n>>k;ans=0;

for(int i=1;i>a>>b;

g[a].push_back(b);

g[b].push_back(a);

} dfs(1,0);

cout<

codeforces686D(樹的重心)

題意 求出以每個點為子樹的重心。思路 可以利用重心的性質,某乙個點的重心在最大的點那個子樹上,並且在在這個節點到最大子樹的重心之間,重心滿足num x 2 num u x為重心,u為要求重心的節點,num代表這個節點的子樹的節點個數。includeusing namespace std typede...

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 686D 樹的重心

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