\[樹鏈剖分~模板小記
\]\(q.\) 樹鏈剖分的背景?
\(a.\) 連通且無環的樹
\(q.\) 樹鏈剖分的作用?
\(a.\) 大幅增加碼量 (
\(a.\) 將一棵樹變成幾條鏈 樹形變成線形 減少處理難度
\(q.\) 樹鏈剖分能處理哪些問題?
\(a_1.\) 修改的有:
將\(x\)節點\(+~or\times val\)
將\(x\)到\(y\)這條路徑上所有節點\(+~or\times val\)
將以\(x\)為根的子樹內所有節點\(+~or\times val\)
\(a_2.\) 查詢的有:
查詢\(x\)到\(y\)這條路徑的權值和\(/\)乘積
查詢\(x\)到\(y\)這條路徑的最大值\(/\)最小值
查詢以\(x\)為根的子樹內的權值和\(/\)乘積
查詢以\(x\)為根的子樹內的最大值\(/\)最小值
這些操作通過線段樹維護
\(q.\) 樹鏈剖分的概念?
\(a.\)
用兩個\(dfs\) 完成下列事情
\(code:\)
void dfs(int x,int father,int deep)
}
\(code:\)
void dfs2(int x,int topn)
}
區間和查詢例子
int querys(int x,int y)
修改也同樣 把求和操作改為修改操作即可
線段樹嘛 大家都會就不用貼了\(qwq\)
例題 \(luogup3384~\)輕重鏈剖分\(/\)樹鏈剖分
小壓了些行 仍有\(180\)行
#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int n=2e5+5;
int n,m,root,mod,res;
int tot,head[n],w[n],f[n];
struct nodeedge[n];
struct segmenttreea[n<<2];
int son[n],id[n],fa[n],dfn,dep[n],size[n],top[n];
void add(int x,int y);
head[x]=tot;
}void up(int x)
void down(int x,int len)
void build(int x,int l,int r)
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
up(x);
}void query(int x,int l,int r,int l,int r)
else
void updater(int x,int y,int k)
int querys(int x)
void updates(int x,int k)
void dfs(int x,int father,int deep)
}void dfs2(int x,int topn)
}int main()
{ scanf("%d%d%d%d",&n,&m,&root,&mod);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
for(int i=1,x,y;i
樹鏈剖分學習小記
入門題 zjoi2008 樹的統計 description 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum...
樹鏈剖分 模板
class match node a n struct no no aa n 4 void init void addpage int x,int y void dfs int s,int faa,int h 根節點,父節點和深度的 if max 0 son s sign void dfs2 int...
模板 樹鏈剖分
define maxn 50010 define l u u 1 define r u u 1 1 寫在類裡面爆棧 int n,m,q int tim 時間戳 int num maxn 樹上每個節點的初始值 int siz maxn siz u 表示以u為根的子樹的節點數 int top maxn ...