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:複製
40 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 用魔法清除掉了,所以這個果樹的每個節...