傳送門
做一道點分治的裸題
這個題要求一顆樹上路徑長度小於等於 \(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 近些日子學了點分治,當然只是學了個模板。所謂點分治,使用於處理樹上路徑的一種分治手段。因為利用了重心的性質,時間複雜度可以保證呢。所謂演算法流程 選取當前子樹的重心 計算路徑總數,不管路徑是否過當前重心 後面會去重 計算起點和終點在同一顆子樹中的合法路徑 因為這條路徑不是簡單路...