洛谷 P3833 SHOI2012 魔法樹

2022-05-21 06:34:14 字數 2421 閱讀 2004

shoi2012 d2t3

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 。

輸入樣例#1:複製

4

0 11 2

2 34

a 1 3 1

q 0q 1

q 2

輸出樣例#1:複製

332

題解:樹鏈剖分的板子好久沒打了,寫一寫。

**:

//

luogu-judger-enable-o2

//luogu-judger-enable-o2

#include #include

#include

#include

#include

#include

#define maxn 400100

#define ll long long

using

namespace

std;

struct

edgea[maxn*2

];struct

treetr[maxn*4

];int

num,n;

intdep[maxn],sz[maxn],id[maxn],son[maxn],tp[maxn],dfn[maxn],las[maxn],fa[maxn];

void addedge(int

from,int

to)void dfs1(int now,intf)}

void dfs2(int now,int

top)

las[now]=num;

}void pushdown(int

xv)}

void pushup(int

xv)void build(int xv,int l,int

r) tr[xv].l=l,tr[xv].r=r,tr[xv].sum=0,tr[xv].lz=0

;

int mid=(l+r)/2

; build(xv*2,l,mid),build(xv*2+1,mid+1

,r);

}void modify(int xv,int l,int r,int

z) pushdown(xv);

if(r<=mid) modify(xv*2

,l,r,z);

else

if(l>mid) modify(xv*2+1

,l,r,z);

else modify(xv*2,l,mid,z),modify(xv*2+1,mid+1

,r,z);

pushup(xv);

}ll query(

int xv,int l,int

r)void add(int x,int y,int

z)

if(dep[x]modify(

1,dfn[y],dfn[x],z);

}int

main()

dfs1(

1,0);num=0

; dfs2(

1,1);fa[1]=1

; build(

1,1,n);

int q;cin>>q;

while(q--)

else

}return0;

}

洛谷 P3833 SHOI2012 魔法樹

shoi2012 d2t3 harry potter 新學了一種魔法 可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa u 保證有fa u u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清...

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

樹鏈剖分 P3833 SHOI2012 魔法樹

harry potter 新學了一種魔法 可以讓改變樹上的果子個數。滿心歡喜的他找到了乙個巨大的果樹,來試驗他的新法術。這棵果樹共有n個節點,其中節點0是根節點,每個節點u的父親記為fa u 保證有fa u u。初始時,這棵果樹上的果子都被 dumbledore 用魔法清除掉了,所以這個果樹的每個節...