這裡是來湊個帖的,勿看。
樹剖詳解
本人題目寫炸了的經歷和經驗
#include
using
namespace
std;
const
int n = 100010 ;
#define int long long
struct edgee[n<<1];
int head[n],f[n],dep[n],size[n],son[n],rk[n],top[n],dfn[n];
int a[n];
//f[i]:i的父親,dep[i]:i的深度,size[i]:i的子樹大小,son[i]:重兒子 ,rk[i]:i的dfs值,與dfn相反
//top[i]:i所在鏈的頂端,dfn[i]:dfs序,時間戳
int n,m,rt,tot,cnt;
int p,r ;
inline
void add(int x,int y)
void dfs1(int rt,int fa,int depth)
return ;
}void dfs2(int rt,int t)
return ;
}struct segtree[n<<1];
inline
void pushup(int rt)
void build(int ll,int rr,int rt)
else
return ;
}void update(int l,int r,int rt,int c)
else
int query(int l,int r,int rt)
inline
int sum(int x,int y)
else
} if (dfn[x]<=dfn[y]) ans=(ans+query(dfn[x],dfn[y],rt))%p ;
else ans=(ans+query(dfn[y],dfn[x],rt))%p ;
return ans%p ;
}inline
void update(int x,int y,int c)
else
}if (dfn[x]<=dfn[y]) update(dfn[x],dfn[y],rt,c) ;
else update(dfn[y],dfn[x],rt,c) ;
return ;
}main()
cnt=0 ;
dfs1(r,0,1) ;
dfs2(r,r) ;
cnt=0;
rt=cnt++ ;
build(1,n,rt);
for (int i=1;i<=m;i++)
else
if (op==2)
else
if (op==3)
else
}}
樹鏈剖分 P3384 模板 樹鏈剖分
題目描述 戳這裡 題解 其實樹剖的重點就在於輕重鏈,這篇文章寫的很好 然而我線段樹寫得全是問題,改了半天2333 如下 include include include using namespace std const int maxn 100005 int n,m,root,tt,tot,lnk ...
P3384 模板 輕重鏈剖分(樹鏈剖分模板)
入口 題目描述 如題,已知一棵包含 nn 個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作 11 格式 1 x y z1 x y z 表示將樹從 xx 到 yy 結點最短路徑上所有節點的值都加上 zz。操作 22 格式 2 x y2 x y 表示求樹從 xx 到 yy 結點最短...
P3384 模板 樹鏈剖分
傳送門 題目描述 如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根...