樹鏈剖分 P3833 SHOI2012 魔法樹

2022-05-27 17:21:10 字數 1852 閱讀 7695

harry potter 新學了一種魔法:可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。

這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa[u],保證有fa[u] < u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清除掉了,所以這個果樹的每個節點上都沒有果子(即0個果子)。

add u v d

表示將點u和v之間的路徑上的所有節點的果子個數都加上d。

接下來,為了方便檢驗 harry 的魔法是否成功,你需要告訴他在釋放魔法的過程中的一些有關果樹的資訊:

query u

表示當前果樹中,以點u為根的子樹中,總共有多少個果子?

第一行乙個正整數n (1 ≤ n ≤ 100000),表示果樹的節點總數,節點以0,1,…,n − 1標號,0一定代表根節點。

接下來n − 1行,每行兩個整數a,b (0 ≤ a < b < n),表示a是b的父親。

接下來是乙個正整數q(1 ≤ ? ≤ 100000),表示共有q次操作。

後面跟著q行,每行是以下兩種中的一種:

a u v d,表示將u到v的路徑上的所有節點的果子數加上d;0 ≤ u,v q u,表示詢問以u為根的子樹中的總果子數,注意是包括u本身的。

對於所有的query操作,依次輸出詢問的答案,每行乙個。答案可能會超過2^32 ,但不會超過10^15 。

剛剛學樹剖練練手,乙個樹剖裸題,線段樹不需要建樹.

話說省選竟然會考模板題emm

ps:陣列開大,開$long \ long $,還有記得用字串讀入,不要用單個字元。

**

#include#include#include#include#define int long long

#define r register

#define ls o<<1

#define rs o<<1|1

#define n 200008

using namespace std;

inline void in(int &x)

while(isdigit(s))

x*=f;

}int n,head[n],tot,depth[n],size[n],son[n],dfn[n],fdfn[n],f[n];

struct codedge[n<<1];

int idx,m,top[n],tr[n<<2],tg[n<<2];

inline void add(int x,int y)

void dfs1(int u,int fa)

}void change(int o,int l,int r,int x,int y,int z)

down(o,l,r);

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

if(x<=mid)change(ls,l,mid,x,y,z);

if(y>mid)change(rs,mid+1,r,x,y,z);

tr[o]=tr[ls]+tr[rs];

}int query(int o,int l,int r,int x,int y)

inline void tchange(int x,int y,int z)

else

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

}if(dfn[x]>dfn[y])swap(x,y);

change(1,1,idx,dfn[x],dfn[y],z);

}signed main()

dfs1(1,0);dfs2(1,1);

in(m);

for(r int x,y,z;m;m--)

}}

P3833 SHOI2012 魔法樹 樹鏈剖分

include define ll long long define rll register int using namespace std template typename t inline void read t x define mid l r 1 define lson rt 1,l,m...

樹鏈剖分 P3384 模板 樹鏈剖分

題目描述 戳這裡 題解 其實樹剖的重點就在於輕重鏈,這篇文章寫的很好 然而我線段樹寫得全是問題,改了半天2333 如下 include include include using namespace std const int maxn 100005 int n,m,root,tt,tot,lnk ...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 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...