#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為根節點的子...