樹鏈剖分板子

2021-08-28 19:56:38 字數 3126 閱讀 7206

個人理解:樹鏈剖分最重要的作用是實現了重鏈上的節點序號都是連續的,這樣對於更改和查詢一條樹鏈就變成了區間操作,可以用線段樹實現。

#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 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...