1468 Tree 樹的點分治

2021-07-10 11:15:33 字數 1080 閱讀 2763

樓教主男人八題之一(好可怕)

似乎不是很難的樣子。。。

點分治大致是這樣:先選出乙個根(一般是重心),然後可以把兩個點之間的路徑分為經過根的和不經過根的,經過根的直接處理記錄,不經過根的遞迴處理計算。似乎還用到了容斥原理的方法。

記錄經過當前根的方案數的方法是:

先以當前的根為起點遍歷一遍記下di

s 陣列即到根的距離,然後排序直接統計距離之和≤k

的點的對數,這樣會把在同一顆子樹裡的點也計算進去,所以在找每一顆子樹的時候再減去那些無效的點對的數量。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 80022

using

namespace

std;

int sc()

while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();

return i*f;

}int vis[n],mx[n],size[n],a[n],dis[n];

int head[n],nxt[n],lst[n],v[n];

int m,tot,n,k,sum,root,ans,top,ti;

void insert(int x,int y,int z)

void get_root(int x,int f)

mx[x]=max(mx[x],sum-size[x]);

if(mx[x]void get_dis(int x,int f)

}int cal(int x,int now)

void solve(int x)

}int main()

k=sc();

sum=n;

root=0;

get_root(1,0);

solve(root);

cout

0;}

bzoj 1468 Tree 點分治模板

time limit 10 sec memory limit 64 mb submit 1527 solved 818 submit status discuss 給你一棵tree,以及這棵樹上邊的距離.問有多少對點它們兩者間的距離小於等於k n n 40000 接下來n 1行邊描述管道,按照題目中...

Tree(樹分治 點分治)

原題 poj 1741 題意 有一棵n個節點的樹,每條邊都有乙個權值,問有多少個節點之間的距離小於等於k,解析 典型的樹分治,對於每一棵樹,我們首先找到它的重心 重心 一棵樹中以這個點為root時的最大子樹的節點數最小 int siz n maxn n 這棵子樹大小,最大子樹大小 void getg...

BZOJ1468 Tree 點分治入門練習題

點分治見bzoj2152 此題只是同時需要把點到根的距離存到陣列裡,可以用sort排序然後再統計 arr陣列排序後只要arr l arr r 小於k,則arr l 與arr中下標 l 1,r 任意乙個的和都滿足要求,直接統計 include include include includeusing ...