已知一棵包含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 ...