Luogu6329 模板 點分樹 震波

2022-05-25 14:18:11 字數 2059 閱讀 2780

終於寫了點分樹,iee

資料範圍:\(n,m\le 10^5\),權值範圍是 \([1,10^4]\),洛谷時限 2s。

首先點分治可以用來解決路徑問題,因為 \(u,v\) 在點分樹上的 lca 一定在原樹路徑上,同時保證了深度 \(\log n\)

如果不帶修的話,首先每個點維護乙個 vector,下標為該點在點分樹上的子樹到該點的距離,值為距離不超過 \(y\) 的權值和。再維護乙個「到該點父親的距離」的 vector 用於去除重複貢獻。

於是對於一次詢問 \(x\),列舉它在點分樹上的祖先 \(g\),考慮 \(g\) 為 lca 時的答案,那麼在這個 vector 上查詢距離不超過 \(y-dis(x,g)\) 即可,再刨去與 \(x\) 在同乙個子樹的貢獻(因為此時 lca 就不是 \(g\) 了)

至於帶修,把字首和改成 bit 即可,修改時候列舉祖先,把對應的下標上的值修改即可。時間複雜度 \(o(n\log^2n)\),空間複雜度 \(o(n\log n)\)。

至於求距離,還是不要在點分樹建樹的時候預處理了,那樣寫得太麻煩,實現不好的話常數還很大。可以用 rmq 求 lca 的方法求距離,都是 \(o(n\log n)-o(1)\) 的複雜度還好寫。

#include#define rint register int

using namespace std;

const int n = 100004;

templateinline void read(t &x)

templateinline bool chmax(t &a, const t &b)

templateinline bool chmin(t &a, const t &b)

int n, m, head[n], to[n << 1], nxt[n << 1], val[n], lans, opt, x, y;

inline void add(int a, int b)

int dep[n], st[17][n << 1], dfn[n], tim, lg2[n << 1];

void dfs1(int x, int f = 0)

}inline int lca(int u, int v)

inline int dis(int u, int v)

int siz[n], rt, wson[n], tot;

bool vis[n];

void dfs2(int x, int f = 0)

chmax(wson[x], tot - siz[x]);

if(wson[x] < wson[rt]) rt = x;

}int fa[n], mxdep;

vectortr1[n], tr2[n];

inline int ei(int x)

void change(vector&tr, int p, int v)

int query(const vector&tr, int p)

void calc(int x, int rt, int len = 1, int f = 0)

chmax(mxdep, len);

}void calc2(int x, int rt, int len = 1, int f = 0)

void work(int x)

}int main()

dfs1(1); lg2[0] = -1;

for(rint i = 1;i <= tim;++ i) lg2[i] = lg2[i >> 1] + 1;

for(rint k = 0;k < 16;++ k)

for(rint i = 1;i <= tim - (1 << k + 1) + 1;++ i)

st[k + 1][i] = dep[st[k][i]] < dep[st[k][i + (1 << k)]] ? st[k][i] : st[k][i + (1 << k)];

wson[0] = 1e9; tot = n; dfs2(1); work(rt);

while(m --)

} else

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

} }}

P6329 模板 點分樹 震波

題目連線 關於點分樹的一些地方今天終於弄明白了,這個題理解的還可以,就是有點卡常,調了好久還是跑的很慢。include include include include include include include include include include define ll long lon...

洛谷P6329 模板 點分樹 震波

在一片土地上有 n 個城市,通過 n 1 條無向邊互相連線,形成一棵樹的結構,相鄰兩個城市的距離為 1 其中第 i 個城市的價值為 value i 不幸的是,這片土地常常發生 並且隨著時代的發展,城市的價值也往往會發生變動。0 x k表示發生了一次 震中城市為 x 影響範圍為 k 所有與 x 距離不...

luogu3384 模板 樹鏈剖分

題目描述 如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子...