樓教主男人八題之一(好可怕)
似乎不是很難的樣子。。。
點分治大致是這樣:先選出乙個根(一般是重心),然後可以把兩個點之間的路徑分為經過根的和不經過根的,經過根的直接處理記錄,不經過根的遞迴處理計算。似乎還用到了容斥原理的方法。
記錄經過當前根的方案數的方法是:
先以當前的根為起點遍歷一遍記下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 ...