洛谷 P3384 模板 樹鏈剖分

2022-05-01 19:15:06 字數 2023 閱讀 7453

已知一棵包含n個結點的樹(連通且無環),每個節點上包含乙個數值,需要支援以下操作:

格式: 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z

格式: 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和

格式: 3 x z 表示將以x為根節點的子樹內所有節點值都加上z

格式: 4 x 表示求以x為根節點的子樹內所有節點值之和

樹鏈剖分裸題。做題時看到與四種操作中的任何一種極為相似的操作,就應該立刻想到樹鏈剖分(並且考慮是否結合線段樹解答)。

關於樹鏈剖分的介紹請看此處:資訊學競賽相關優秀文章合集

#include#include#include#include#include#define rint register int

#define mem(a,b) memset(a,(b),sizeof(a))

#define temp templateusing namespace std;

typedef long long ll;

temp inline void read(t &x)

#define mid ((l+r)>>1)

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

#define len (r-l+1)

const int maxn=200000+10;

int n,m,r,mod;

//見題意

int e,beg[maxn],nex[maxn],to[maxn],w[maxn],wt[maxn];

//鏈式前向星陣列,w、wt初始點權陣列

int a[maxn<<2],laz[maxn<<2];

//線段樹陣列、lazy操作

int son[maxn],id[maxn],fa[maxn],cnt,dep[maxn],siz[maxn],top[maxn];

//son重兒子編號,id新編號,fa父親節點,cnt dfs_clock/dfs序,dep深度,siz子樹大小,top當前鏈頂端節點

int res=0;

//查詢答案

inline void add(int x,int y) //鏈式前向星加邊

//-------------------------------------- 以下為線段樹

inline void pushdown(int rt,int lenn)

inline void build(int rt,int l,int r)

build(lson);

build(rson);

a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;

}inline void query(int rt,int l,int r,int l,int r)

else

}inline void update(int rt,int l,int r,int l,int r,int k)

else

}//---------------------------------以上為線段樹

inline int qrange(int x,int y)

inline void updrange(int x,int y,int k) //同上

inline int qson(int x)

inline void updson(int x,int k) //同上

inline void dfs1(int x,int f,int deep) //x當前節點,f父親,deep深度

}inline void dfs2(int x,int topf) //x當前節點,topf當前鏈的最頂端的節點

}int main()

dfs1(r,0,1);

dfs2(r,r);

build(1,1,n);

while(m--)

else if(k==2)

else if(k==3)

else

}}

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

洛谷 P3384 模板 樹鏈剖分

樹鏈剖分詳情 跳轉大佬部落格 解題心得 個人看來其實樹鏈剖分就是把一棵標號沒有實際意義的樹重新標號,標號的規則按照重鏈優先,在有序之後用線段樹之類的資料結構來維護。include using namespace std const int maxn 1e5 100 struct node node ...