AcWing252 樹(點分治)

2022-05-28 11:51:12 字數 849 閱讀 2267

本題如果k的範圍較小的話,可以使用樹狀陣列記錄答案,但是因為很大

考慮使用雙指標+容斥原理。

也就是直接算整個子樹的答案,之後再在列舉兒子節點的時候,把加上u-v這條邊的合法答案全部清除,這樣就做到了不重不漏

#includeusing

namespace

std;

typedef

long

long

ll;typedef pair

pll;

const

int n=1e5+10

;int

h[n],ne[n],e[n],w[n],idx;

intn,k;

introot,cnt;

intd[n],vis[n];

intsz[n];

void add(int a,int b,int

c)void dfs_rt(int u,int fa,int

tot)

n=max(n,tot-sz[u]);

if(n*2

<=tot)

root=u;

}void dfs_dis(int u,int fa,intx)}

intget(int u,int

x)

return

ans;

}void dfs_sz(int u,int

fa)}

int work(int u,int

tot)

}return

res;

}int

main()

cout

<1,n)<}}

view code

AcWing 252 樹 點分治

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

AcWing252 樹 (點分治模板題)

傳送門 做一道點分治的裸題 這個題要求一顆樹上路徑長度小於等於 k 的路徑的數量。可以用樹狀陣列維護子樹到重心距離在 0,k dis 的節點數量。但樹狀陣列沒法維護 0 的資訊,就同意偏移 1 include define lowbit x x x using namespace std const...

點分治(樹分治)

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