樹的點分治

2021-08-15 15:36:44 字數 757 閱讀 3594

codeforces 150e 

通過點分治以及合併子樹檢查二分的答案

用深度從小到大的方式可以剪枝,達到nlog^2(n)的複雜度(不離散化常數巨大,離散化常數依然巨大)

#include#include#include#include#include#define maxn 100005

#define f first

#define s second

using namespace std;

int n,l,r;

vector>g[maxn];

//point divide

int seq[maxn],cnts,siz[maxn],rch[maxn],num[maxn];

bool vis[maxn];

int rt,min;

void dfs(int now,int ff,int tsz)

int q[maxn],l,r;

bool check(int lim)

for(;lr;l++);

if(l=0)

}for(int j=1;j<=maxdep;j++)

if(f[j]>1;

if(check(mid)) l=mid;

else r=mid-1; }

check(l);

//printf("%d\n",l);

printf("%d %d\n",ansx,ansy);

}

點分治(樹分治)

將原問題分解成若干相同形式,相互獨立的子問題,各個擊破 一般用來解決有關樹上路徑的統計和詢問 p4178 tree 給定一棵 n 個節點的樹,每條邊有邊權,求出樹上兩點距離小於等於 k 的點對數量。暴力做法 o n2 點分治做法 選擇乙個點作為分治中心,令其為rt做dfs。對於一條路徑path u,...

Tree(樹分治 點分治)

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

POJ 1741 Tree 樹的分治 點分治

題目大意 給出一顆無根樹和每條邊的權值,求出樹上兩個點之間距離 k的點的對數。思路 樹的點分治。利用遞迴和求樹的重心來解決這類問題。因為滿足題意的點對一共只有兩種 1.在以該節點的子樹中且不經過該節點。2.路徑經過該節點。對於第一種點,我們遞迴處理 第二種點,我們可以將所有子樹的節點到這個子樹的根節...