BZOJ 2836 魔法樹 樹鏈剖分

2022-03-17 10:42:29 字數 1497 閱讀 2603

40 1

1 22 3

4add 1 3 1

query 0

query 1

query 233

2樹鏈剖分線段樹裸題。值得注意的是維護一下出棧序,這樣子樹就是該點到出棧+1的位置。在lca的過程中直接查詢/維護即可

下面是**

#include #include #include #include #include #define ls p<<1

#define rs ls|1

#define lson l,mid,ls

#define rson mid+1,r,rs

#define im int mid = (l + r) >> 1

using namespace std;

const int n = 1100000;

int son[n],siz[n],fa[n],top[n],dep[n];

int idx[n],cnt2;

int to[n<<1],next[n<<1],head[n],cnt1;

int sec[n<<1];

int n,m;

class readin

public:

inline int read()

return x;

}inline char getc()

}rd;

class segmenttree

public:

int query(int l,int r,int p,int x,int y)

im;if(laz[p])

int re=0;

if(x<=mid)

re+= query(lson,x,y);

if(y>mid)

re+= query(rson,x,y);

return re;

}void change(int l,int r,int p,int x,int y,int c)

im;if(laz[p])

if(x<=mid)

change(lson,x,y,c);

if(y>mid)

change(rson,x,y,c);

sum[p]=sum[ls]+sum[rs];

}}tr;

class treechaindissection }}

void dfs2(int p,int t)

void lcac(int x,int y,int z)

if(dep[x]

tr.change(1,n,1,idx[y],idx[x],z);

}}tcd;

class pre

public:

void init()

m=rd.read();

}}pr;

void solve()

else

}}#undef int

int main()

BZOJ 3306 樹 樹鏈剖分

和bzoj 3083比就是弱化版了。樣例都有點像?include include using namespace std const int n 100005,m n 3,inf 0x7fffffff int read int next m to m head n sz n son n top n ...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

樹鏈剖分 bzoj2243

time limit 20 sec memory limit 512 mb submit 2492 solved 960 submit status 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色...