洛谷3384 模板 樹鏈剖分 題解

2022-05-16 14:12:33 字數 2299 閱讀 1953

如題,已知一棵包含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為根節點的子樹內所有節...