AcWing252 樹 (點分治模板題)

2022-06-29 15:45:08 字數 949 閱讀 2467

傳送門

做一道點分治的裸題

這個題要求一顆樹上路徑長度小於等於 \(k\) 的路徑的數量。

可以用樹狀陣列維護子樹到重心距離在 \([0,k-dis]\) 的節點數量。

但樹狀陣列沒法維護 \(0\) 的資訊,就同意偏移 \(1\)。

#include #define lowbit(x) ((x)&(-x))

using namespace std;

const int maxn=1e4+10;

const int maxm=1e7+10;

int n,k;

int head[maxn],to[maxn*2],nxt[maxn*2],val[maxn*2],tot;

int rt,siz[maxn],maxp[maxn],sum,dead[maxn];

int ta[maxm],dis[maxn],cnt,ans;

void update(int k,int x)

void add(int u,int v,int w)

void getrt(int u,int fa)

maxp[u]=max(maxp[u],sum-siz[u]);

if(maxp[u]que;que.push(1);

for(int i=head[u];i;i=nxt[i])

while(!que.empty()) update(que.front(),-1),que.pop();

}void divide(int u)

}void solve()

maxp[0]=sum=n;

getrt(1,0);

getrt(rt,0);

divide(rt);

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

}int main()

return 0;

}

AcWing252 樹(點分治)

本題如果k的範圍較小的話,可以使用樹狀陣列記錄答案,但是因為很大 考慮使用雙指標 容斥原理。也就是直接算整個子樹的答案,之後再在列舉兒子節點的時候,把加上u v這條邊的合法答案全部清除,這樣就做到了不重不漏 includeusing namespace std typedef long long l...

AcWing 252 樹 點分治

每次找到樹的重心,分治下去統計答案 經過當前根節點的路徑 即可 統計答案使用了指標掃瞄陣列的方法,要注意去掉同一子樹內路徑的答案 還可以直接在樹上統計子樹答案 這個方法的好處是保證了分開的兩段路徑不在同一子樹內 但是要使用平衡樹,複雜度高 include include include includ...

點分治模板

luogu 3806 近些日子學了點分治,當然只是學了個模板。所謂點分治,使用於處理樹上路徑的一種分治手段。因為利用了重心的性質,時間複雜度可以保證呢。所謂演算法流程 選取當前子樹的重心 計算路徑總數,不管路徑是否過當前重心 後面會去重 計算起點和終點在同一顆子樹中的合法路徑 因為這條路徑不是簡單路...