如題,已知一棵包含n個結點的樹(連通且無環),每個節點上包含乙個數值,需要支援以下操作:不會寫樹鏈剖分的請看:操作1: 格式: 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z
操作2: 格式: 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和
操作3: 格式: 3 x z 表示將以x為根節點的子樹內所有節點值都加上z
操作4: 格式: 4 x 表示求以x為根節點的子樹內所有節點值之和
如果看完了你就應該會寫1和2了。
其實3和4也很簡單,因為如果你要按照這種方式樹鏈剖分的話,那麼pos[u]~pos[u]+size[u]-1就是u及其子樹的所有點。
#include#include#include
#include
using
namespace
std;
const
int n=1e5+5
;const
int inf=2147483647
;inline
intread()
while(ch>='
0'&&ch<='
9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return w?-x:x;
}struct
nodeedge[
2*n];
struct
treet[
4*n];
inthead[n],cnt,tot,n,m,rt,p;
inline
void add(int u,int
v)int
fa[n],dep[n],size[n],son[n],top[n],pos[n],idx[n],val[n];
void dfs1(int
u)
return;}
void dfs2(int u,int
anc)
return;}
void build(int a,int l,int
r)
int mid=(l+r)>>1
; build(a*2
,l,mid);
build(a*2+1,mid+1
,r);
t[a].sum=(t[a*2].sum%p+t[a*2+1].sum%p)%p;
}void pushdown(int a,int l,int
r)
return;}
void modify(int a,int l,int r,int l1,int r1,int
v)
int mid=(l+r)>>1
; pushdown(a,l,r);
modify(a*2
,l,mid,l1,r1,v);
modify(a*2+1,mid+1
,r,l1,r1,v);
t[a].sum=(t[a*2].sum%p+t[a*2+1].sum%p)%p;
return;}
void pathmodify(int u,int v,int
c) modify(
1,1,n,pos[top[u]],pos[u],c);
u=fa[top[u]];
}if(dep[u]>dep[v])
modify(
1,1,n,pos[u],pos[v],c);
return;}
void nodemodify(int u,int
c)int query(int a,int l,int r,int l1,int r1)
int pathquery(int u,int v)
return (pathquery(fa[top[u]],v)%p+query(1,1,n,pos[top[u]],pos[u])%p)%p;
}if(dep[u]>dep[v])
return query(1,1,n,pos[u],pos[v])%p;
}int nodequery(int
u)void
init()
intmain()
init();
build(
1,1,n);
while(m--)
if(op==2
)
if(op==3
)
if(op==4
) }
return0;
}
洛谷 3384 模板樹鏈剖分
如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子樹內所有節...
洛谷p3384 模板 樹鏈剖分題解
洛谷p3384 模板 樹鏈剖分錯誤記錄 首先感謝 lfd 在課上調了出來 orz 1 以後少寫全域性變數 2 線段樹遞迴的時候最好把左右區間一起傳 3 寫 dfs 的時候不要寫錯名字 4 使用線段樹的操作的時候才要用到 dfs 序 5 需要開乙個陣列來記錄在 dfs 序下的節點是什麼也方便線段樹的賦...
樹鏈剖分 洛谷 P3384 模板 樹鏈剖分
step1 problem 題目 給你一棵n個點樹,m個操作,r是根,結果取模mod.操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子樹內所有節...