點分治模板 (例題 樹中點對距離) 待更新 坑

2021-07-22 14:50:15 字數 1339 閱讀 4264

description

給出一棵帶邊權的樹,問有多少對點的距離<=len

c表示最大兒子的節點的size

size表示子樹大小

處理子樹大小

void get_size(int x,int y)

}

找重心

//size[r]-size[x]是x上面部分的樹的尺寸,跟x的最大孩子比,找到最大孩子的最小差值節點

void get_root(int r,int x,int y)

}

求每個點離重心的距離

void get_dis(int x,int

sum,int y)

}

計算以x為根的子樹中有多少點對的距離小於等於len

int calc(int x,int

sum)

大肥水

void dfs(int x)

}}

code

#include 

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define n 10005

using namespace std;

int n,len,l=0,ans=0,max=0,root=0;

int t[n*2],last[n],next[n*2],val[n*2],size[n],c[n],dis[n],num=0;

bool bz[n];

void add(int

x,int

y,int z)

void get_size(int

x,int

y)

}void get_root(int r,int

x,inty)}

void get_dis(int

x,int sum,inty)}

int calc(int

x,int sum)

void dfs(int

x) }

}int main()

dfs(1);

printf("%d\n",ans);

return

0;}

點分治模板 (樹中點對距離)

點分治就是在一棵樹中,將每個點分治 基本概念 點分治 將一棵無根樹變成有根樹,再分別處理每棵有根子樹。重心 在一棵樹中,這個點的最大子樹是所有點中最小的。也可以說是刪除該點時,樹內剩下的子樹最大節點數最小。size i 表示以i為根的子樹節點數量。如何求重心?求出size,什麼是定義,就怎麼求。一般...

樹中點對距離(點分治)

給出一棵帶邊權的樹,問有多少對點的距離 len 這是一道點分治的經典題目,可以給點分治的初學者練手。點分治,顧名思義就是把每個點分開了處理答案。假設,目前做到了以x為根的子樹。先求出子樹中每個點到根的距離di s 對於兩個點 i 和 j,如果di si d isj k 那麼 i j 就是乙個合法的點...

點分治入門 樹中點對距離詳(?)解

其中樹最多有10000個點,len maxlongint 這是一道模板題目。對於乙個點x,我們考慮如何求解經過x點的路徑方案數,設為f x 考慮直接從x出發做一遍dfs,算出所有未到過的點到x點的距離,然後排序。設兩個指標,如果length l length r len,那麼length l len...