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.路徑經過該節點。對於第一種點,我們遞迴處理 第二種點,我們可以將所有子樹的節點到這個子樹的根節...