BZOJ4034 HAOI2015 樹上操作

2021-08-14 01:13:47 字數 2165 閱讀 4893

標籤:樹鏈剖分,線段樹

題目傳送門

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

6hint

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

比較普通的樹鏈剖分

打上lazy標記的線段樹

注意有些值要開long long

#include

#include

#include

#include

#include

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=last[x];i;i=e[i].next)

using namespace std;

inline ll read()

while(ch>='0'&&ch<='9')

return

x*f;

}const int maxn=1e5+6;

int n,m,cnt=0,last[maxn],sz=0;

intpos[maxn],mx[maxn],v[maxn],belong[maxn],fa[maxn],son[maxn];

ll tag[maxn<<2],sum[maxn<<2];

struct edgee[maxn<<1];

void insert(int u,int v);last[u]=cnt;

e[++cnt]=(edge);last[v]=cnt;

}void dfs1(intx)}

void dfs2(int

x,int chain)

void pushdown(int l,int r,int k)

void change(int k,int l,int r,int

x,int

y,ll val)

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

if(x

<=mid)change(k<<1,l,mid,x,min(mid,y),val);

if(y>=mid+1)change(k<<1|1,mid+1,r,max(mid+1,x),y,val);

sum[k]=sum[k<<1]+sum[k<<1|1];

}ll querysum(int k,int l,int r,int

x,int

y)ll query(int

x) ans+=querysum(1,1,n,1,pos[x]);

return ans;

}int main()

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

rep(i,1,n)change(1,1,n,pos[i],pos[i],v[i]);

rep(i,1,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 樹上操作

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