bzoj 4034 HAOI2015 樹上操作

2021-07-30 15:19:41 字數 2428 閱讀 4606

4034: [haoi2015]樹上操作

time limit: 10 sec memory limit: 256 mb

submit: 4216 solved: 1340

[submit][status][discuss]

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 3sample output

hint

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

source

鳴謝bhiaibogf提供

【分析】

全裸…

貌似比洛谷上的樹鏈剖分模板簡單一些

【**】

//haoi 樹上操作 

#include

#include

#include

#define ll long long

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

const

int mxn=100005;

int n,m,root,cnt,tot;

int pos[mxn],w[mxn],head[mxn];

struct edge f[mxn<<1];

struct tree

e[mxn];

struct lenth

t[mxn<<2];

inline

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}inline

void add(int u,int v) //加邊

inline

void dfs1(int u) //第一次dfs

}inline

void dfs2(int u,int top) //第二次dfs

}e[u].e=tot;

}inline

void update(int num) //線段樹更新

inline

void ope(int num,ll c)

inline

void pushdown(int num)

}inline

void build(int num,int l,int r) //線段樹build

int mid=l+r>>1;

build(num<<1,l,mid);

build(num<<1|1,mid+1,r);

update(num);

}inline

void add(int num,int l,int r,int c) //線段樹區間加

pushdown(num);

if(l<=t[num<<1].r) add(num<<1,l,r,c);

if(r>=t[num<<1|1].l) add(num<<1|1,l,r,c);

update(num);

}inline ll query(int num,int l,int r)

inline ll find(int x,int y)

if(e[x].dep1,e[x].s,e[y].s);

else

ans+=query(1,e[y].s,e[x].s);

return ans;

}int main()

dfs1(1);

dfs2(1,1);

build(1,1,n);

while(m--)

if(opt==2)

if(opt==3)

}return

0;}

bzoj4034 HAOI2015 樹上操作

傳送門 description 有一棵點數為 n 的樹,以點 1 為根,且樹點有邊權。然後有 m 個 操作,分為三種 操作 1 把某個節點 x 的點權增加 a 操作 2 把某個節點 x 為根的子樹中所有點的點權都增加 a 操作 3 詢問某個節點 x 到根的路徑中所有點的點權和。input 第一行包含...

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 表示點數和運算元。接下來一...