樹鏈剖分-mod
estc
oder
modestcoder
modest
code
r如果你是重兒子,你就在重路徑上。
如果你是輕兒子,暴力沿著祖先向上爬最多log
nlogn
logn
次就可以遇到重路徑。(或者到根)
而樹上操作基本就是找祖先
也許有人喜歡我的碼風…
#include
#include
#define mid (l + r) / 2
using std::swap;
const
int maxn =
1e5+10;
const
int seg = maxn *40;
int sum[seg]
, tag[seg]
;int cnt =0;
int fa[maxn]
, top[maxn]
, dep[maxn]
=, siz[maxn]
=, w[maxn]
, val[maxn]
, son[maxn]
, id[maxn]
;int h[maxn]
=, tot =0;
struct eed[
2* maxn]
;int n, m, rt, mod;
void
build
(int l,
int r,
int k)
build
(l, mid, k <<1)
;build
(mid +
1, r,
(k <<1)
+1);
sum[k]
=(sum[k <<1]
+ sum[
(k <<1)
+1])
% mod;
}void
pushdown
(int l,
int r,
int k)
intquery
(int stdl,
int stdr,
int l,
int r,
int k)
void
update
(int stdl,
int stdr,
int l,
int r,
int k,
int tg)
pushdown
(l, r, k)
;update
(stdl, stdr, l, mid, k <<
1, tg)
;update
(stdl, stdr, mid +
1, r,
(k <<1)
+1, tg)
; sum[k]
=(sum[k <<1]
+ sum[
(k <<1)
+1])
% mod;
}void
dfs1
(int k,
int f)
//fa,dep,siz,son
}void
dfs2
(int k,
int tp)
//id,top,rk
}void
update_path
(int x,
int y,
int dlt)
if(dep[x]
> dep[y]
)swap
(x, y)
;update
(id[x]
, id[y],1
, n,
1, dlt);}
intquery_path
(int x,
int y)
if(dep[x]
> dep[y]
)swap
(x, y)
;return
(ret +
query
(id[x]
, id[y],1
, n,1)
)% mod;
}void
update_son
(int x,
int dlt)
intquery_son
(int x)
void
add(
int f,
int t)
intmain()
dfs1
(rt,0)
;dfs2
(rt, rt)
;build(1
, n,1)
;while
(m--)if
(opt ==2)
if(opt ==3)
if(opt ==4)
}return0;
}
樹鏈剖分學習筆記
寫 又犯了很sb的錯誤,線段樹寫錯了。好像每次都會把r l 1寫成l r 1,然後就只有20分。寫的比較醜,壓了壓之後190行。基本上是我打過的最長的乙個模板了 然後簡單介紹一下樹剖吧。樹鏈剖分,就是把樹剖分成鏈,然後用資料結構來維護這些鏈,使得詢問 修改的複雜度達到o logn o l ogn 不...
樹鏈剖分學習筆記
前言 書上只講了重鏈剖分,菜雞也只會這一種,想看其他的是別想了。要會樹鏈剖分,首先你需要了解一些概念。我們把乙個節點的所有兒子節點中子樹節點數最大的稱為重兒子,也就是size最大的子節點。size的定義我在講換根dp時說過,因此不再贅述。對於每個節點的重兒子,我們用 son x 來記錄它,父親節點到...
樹鏈剖分 學習筆記
前置知識 dfs 序,線段樹 我們可以回顧兩個問題 1.樹上從 s 到 t 的路徑,每個點權值加上 z 很簡單。遍歷整棵樹即可。2.求樹上 s 到 t 的權值和。lca 可做。可以利用 lca 的性質 dis s dis t 2 dis lca 做即可。時間複雜度 o n log n 但是把這兩個問...