個人理解:樹鏈剖分最重要的作用是實現了重鏈上的節點序號都是連續的,這樣對於更改和查詢一條樹鏈就變成了區間操作,可以用線段樹實現。
#include
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
const
int maxn=
2e5+5;
int n,m,r,p;
int val[maxn]
,nxb[maxn]
;struct node
node
(int u,
int v,
int nxt):u
(u),
v(v)
,nxt
(nxt)
}edge[maxn<<2]
;int cnt;
int head[maxn<<2]
;int dep[maxn]
,fa[maxn]
,sonsize[maxn]
,hson[maxn]
,topfa[maxn]
;//深度,父親,子樹的節點數(包括根),重兒子,鏈頂
int newval[maxn]
;void
addedge
(int u,
int v)
//鏈式前向星
int tree[maxn<<2]
,lazy[maxn<<2]
;//線段樹陣列即懶惰標記陣列
void
bulid
(int rt,
int l,
int r)
//建樹
int mid=
(l+r)
>>1;
bulid
(lson,l,mid)
;bulid
(rson,mid+
1,r)
; tree[rt]
=(tree[lson]
+tree[rson]
)%p;
}void
pushdown
(int rt,
int l,
int r)
//向下更新
void
updata
(int rt,
int l,
int r,
int x,
int y,
int v)
int mid=
(l+r)
>>1;
pushdown
(rt,l,r);if
(y<=mid)
updata
(lson,l,mid,x,y,v)
;else
if(x>=mid+1)
updata
(rson,mid+
1,r,x,y,v)
;else
updata
(lson,l,mid,x,mid,v)
,updata
(rson,mid+
1,r,mid+
1,y,v)
; tree[rt]
=(tree[lson]
+tree[rson]
)%p;
}int
query
(int rt,
int l,
int r,
int x,
int y)
int mid=
(l+r)
>>1;
pushdown
(rt,l,r)
;int ret=0;
if(y<=mid)ret=
query
(lson,l,mid,x,y)
%p;else
if(x>=mid+
1)ret=
query
(rson,mid+
1,r,x,y)
%p;else ret=
(query
(lson,l,mid,x,mid)
+query
(rson,mid+
1,r,mid+
1,y)
)%p;
return ret;
}void
dfs1
(int u,
int f,
int deep)
//處理點的深度、父親、重兒子及以某一點為根的子樹大小
}void
dfs2
(int u,
int topf)
//給每個點乙個新的下標,處理鏈頂
}int
sum_subtree
(int u)
void
up_subtree
(int u,
int k)
intsum_lian
(int u,
int v)
if(dep[u]
>dep[v]
)swap
(u,v)
;//深度淺的下表小
ret=
(ret+
query(1
,1,n,nxb[u]
,nxb[v]))
%p;return ret;
}void
up_lian
(int u,
int v,
int k)
if(dep[u]
>dep[v]
)swap
(u,v)
;updata(1
,1,n,nxb[u]
,nxb[v]
,k);
}int
main()
cnt=0;
dfs1
(r,0,1
);dfs2
(r,r)
; cnt=0;
bulid(1
,1,n);
int op;
while
(m--
)else
if(op==2)
else
if(op==3)
else
}}
樹鏈剖分題目彙總 板子
辣雞的我終於開始學樹鏈剖分了,而ly聚聚早都會了qaq.首先是乙個板子題,就是板子 題目大意 四種操作,板子。思路 板子。線段樹維護分出來的鏈。accode 板子 pragma comment linker,stack 1024000000,1024000000 include include in...
樹鏈剖分 樹鏈剖分講解
好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...
演算法入門 樹鏈剖分 輕重鏈剖分
目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...