洛谷p3384 樹鏈剖分板子題

2021-10-08 03:33:48 字數 3072 閱讀 3969

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include <

set>

#include

#define pi 3.1415926535898

#define ll long long

#define lson rt<<

1#define rson rt<<1|

1#define eps 1e-6

#define ms

(a,b)

memset

(a,b,

sizeof

(a))

#define legal

(a,b) a&b

#define print1 printf

("111\n"

)using namespace std;

const int maxn =

2e5+10;

const int inf =

0x1f1f1f1f

;const ll llinf =

1e17+10

;const int mod =

2333

;int n,m,r,p;

//鏈式前向星建圖

int len,first[maxn]

;struct node

e[maxn]

;//記錄輸入的資料 和 dfs序上對應的值

int a[maxn]

,wt[maxn]

;//線段樹建樹所用的陣列

int t[maxn<<2]

,lz[maxn<<2]

,lens[maxn<<2]

;//下面的陣列用於樹鏈剖分

//陣列從左往右分別記錄重兒子結點,dfs序,父親節點,節點深度,子樹節點個數,鏈的頭結點

int son[maxn]

,id[maxn]

,fa[maxn]

,dep[maxn]

,siz[maxn]

,top[maxn]

;int res=

0,cnt;

inline void

add(int x,int y)

inline void

pushdown

(int rt)

}inline void

pushup

(int rt)

inline void

build

(int rt,int l,int r)

int mid=

(l+r)

>>1;

build

(lson,l,mid)

;build

(rson,mid+

1,r)

;pushup

(rt);}

inline void

query

(int rt,int l,int r,int l

,int r

)pushdown

(rt)

; int mid=

(l+r)

>>1;

if(l<=mid)

query

(lson,l,mid,l,

r);if

(r>mid)

query

(rson,mid+

1,r,l,

r);}

inline void

updata

(int rt,int l,int r,int l

,int r

,int k)

pushdown

(rt)

; int mid=

(l+r)

>>1;

if(l<=mid)

updata

(lson,l,mid,l,

r,k);if

(r>mid)

updata

(rson,mid+

1,r,l,

r,k)

;pushup

(rt);}

inline int qrange

(int x,int y)

//在同乙個鏈上的時候從上到下用dfs序遍歷

if(dep[x]

>dep[y]

)swap

(x,y)

; res=0;

query(1

,1,n,id[x]

,id[y]);

ans+=res;

return ans%p;

}//修改操作也跟上面的查詢操作相似

inline void

updrange

(int x,int y,int k)

if(dep[x]

>dep[y]

)swap

(x,y)

;updata(1

,1,n,id[x]

,id[y]

,k);

}inline int qson

(int x)

inline void

updson

(int x,int k)

//第一遍dfs處理出各個點的深度,父親節點,兒子個數,還有重兒子結點

inline void

dfs1

(int x,int f)

}//第二次dfs記錄dfs序 但要先遍歷重鏈 在遍歷輕鏈

inline void

dfs2

(int x,int t)

}int main()

dfs1

(r,0);

dfs2

(r,r)

;build(1

,1,n);

while

(m--)if

(k==2)

if(k==3)

if(k==4)

}}

洛谷P3384 樹鏈剖分

這是一道樹鏈剖分的模板題,首先要學會線段樹 dfs 鏈式前向星之類的,不然 打暴力吧 本題很考驗 能力,難度不大,主要是細節繁多。我調了1h 樹鏈剖分的原理不再贅述 詳見 資訊學奧賽一本通 提高版 主要說一下一些容易錯的細節。1 include 2 include 3 include 4 typed...

洛谷 P3384 模板 樹鏈剖分

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

P3384 模板 樹鏈剖分 洛谷

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