樹鏈剖分 模板小記

2022-09-19 10:42:07 字數 1853 閱讀 6356

\[樹鏈剖分~模板小記

\]\(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 ...