bzoj4034 HAOI2015 樹上操作

2021-07-27 07:41:49 字數 2162 閱讀 2774

傳送門

description

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個

操作,分為三種:

操作 1 :把某個節點 x 的點權增加 a 。

操作 2 :把某個節點 x 為根的子樹中所有點的點權都增加 a 。

操作 3 :詢問某個節點 x 到根的路徑中所有點的點權和。

input

第一行包含兩個整數 n, m 。表示點數和運算元。接下來一行 n 個整數,表示樹中節點的初始權值。接下來 n-1

行每行三個正整數 fr, to , 表示該樹中存在一條邊 (fr, to) 。再接下來 m 行,每行分別表示一次操作。其中

第乙個數表示該操作的種類( 1-3 ) ,之後接這個操作的引數( x 或者 x a ) 。

output

對於每個詢問操作,輸出該詢問的答案。答案之間用換行隔開。

sample input

5 51 2 3 4 5

1 21 4

2 32 5

3 31 2 1

3 52 1 2

3 3

sample output

hint

對於 100% 的資料, n,m<=100000 ,且所有輸入資料的絕對值都不會超過 10^6 。

貌似比上一道洛谷的板子題還簡單?

sb的我竟然還wa了一次

code:

#include#include#define ll long long

const

int inf=1e9;

const

int maxn=1e5+10;

struct aa

t[400001];

struct edge

a[2*maxn];

int s[maxn],head[maxn];

int top[maxn],son[maxn],pos[maxn],deep[maxn],f[maxn],size[maxn],num[maxn];

int n,m,tot,e_num=-1,x,y,k;

inline int max(int a,int b)

inline int min(int a,int b)

inline void swap(int &a,int &b)

inline void read(int &n)

while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();

if(b) n*=-1;

}inline void add(int from,int

to)void dfs(int

now,int fa,int depth)

}void dfs2(int

now,int high)

inline void pushdown(int l,int r,int

now)

inline void update(int

now)

void build(int l,int r,int

now)

intmid=(l+r)>>1;

build(l,mid,now

<<1);

build(mid+1,r,now

<<1|1);

update(now);

}void add(int l,int r,int l,int r,int

now,int num)

intmid=(l+r)>>1;

pushdown(l,r,now);

if(l<=mid) add(l,r,l,mid,now

<<1,num);

if(r>mid) add(l,r,mid+1,r,now

<<1|1,num);

update(now);

}ll ask(int l,int r,int l,int r,int

now)

void addnum(int x,int y)

ll askpath(int x,int y)

if(deep[top[x]]1,n,1);

return ans+askpath(f[top[x]],y);

}int main()

return 0;

}

bzoj 4034 HAOI2015 樹上操作

4034 haoi2015 樹上操作 time limit 10 sec memory limit 256 mb submit 4216 solved 1340 submit status discuss description 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 ...

BZOJ 4034 HAOI2015 樹上操作

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。第一行包含兩個整數 n,m 表示點數和運算元。接下來一...

BZOJ4034 HAOI2015 樹上操作

有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。第一行包含兩個整數 n,m 表示點數和運算元。接下來一...