樹鏈剖分模板

2021-08-25 02:35:45 字數 2129 閱讀 6245

剖分後的樹有如下性質(易證):

性質①: 如果 (v,u) 為輕邊,則 size[u]∗2性質②: 從根到某一點的路徑上輕鏈重鏈的個數都不大於 logn。

**:

#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;

#define inf 0x3f3f3f3f

const int maxn=1e5+10;

const int maxn=1e3+10;

const long long mod=100000000;

using namespace std;

int head[maxn],cnt;

#define lson l,m,rt<<1

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

struct edge

edge[maxn*2];

void addedge(int u,int v,int w)

struct tree

tree[maxn*2];

int f[maxn];//儲存父節點

int depth[maxn],size[maxn];//儲存節點數

int son[maxn];//儲存重兒子

int rk[maxn];//dfs序在樹上對應的頂點

int top[maxn];//儲存當前節點所在鏈的頂點節點

int id[maxn];//dfs序編號

int num;

int a[maxn],n;

void dfs1(int u,int pre,int dep)

}}void dfs2(int u,int t)//鏈結重鏈

}}void push_up(int rt)

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

int m=(l+r)>>1;

build(lson);

build(rson);

push_up(rt);

}void push_down(int rt)

}void updata(int l,int r,int c,int l,int r,int rt)

push_down(rt);

int m=(l+r)>>1;

if(r>m) updata(l,r,c,rson);

if(l<=m) updata(l,r,c,lson);

push_up(rt);

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

push_down(rt);

int m=(l+r)>>1;

int ans=0;

if(r>m) ans+=query(l,r,rson);

if(l<=m) ans+=query(l,r,lson);

push_up(rt);

return ans;

}int sum(int x,int y)

else

fx=top[x],fy=top[y];

}ans+=query(min(id[x],id[y]),max(id[x],id[y]),1,n,1);

return ans;

}void change(int x,int y,int c)

else

fx=top[x],fy=top[y];

}updata(min(id[x],id[y]),max(id[x],id[y]),c,1,n,1);

}void init()

int main(int argc, char const *argv)

for(int i=1;idfs1(rt,0,1);

dfs2(rt,rt);

build(1,n,1);

while(m--)

else if(op==2)

else if(op==3)

else if(op==4)

}return 0;

}

樹鏈剖分 模板

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 ...

樹鏈剖分模板

點權模板 1 m a b c將節點a到節點b路徑上所有點都染成顏色c 2 q a b詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 const int n 100100 struct edge g n 2 int cnt,head...