BZOJ 4034 HAOI2015 樹上操作

2021-07-31 06:37:31 字數 1989 閱讀 9251

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

操作,分為三種:

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

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

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

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

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

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

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

5 51 2 3 4 5

1 21 4

2 32 5

3 31 2 1

3 52 1 2

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

我們注意到,對於一顆樹而言,對他進行樹剖之後呢,根於其子樹的編號一定是連續的,那麼我們就可以愉快的樹剖了

#include 

#define n 1000005

#define ll long long

intread()

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

return

x * f;

}struct note

e[n << 1];

int cnt;

intnext[n];

void insert(int

x,int

y); next[x] = cnt;

e[++cnt] = (note); next[y] = cnt;

}struct tree

t[n];

int n,m;

int top[n];

int fa[n],son[n];

int dep[n],size[n];

intpos[n],mx[n],pre[n];

void dfs1(int

x,int d,int f)

}int tot;

void dfs2(int

x,int k)

}}void pushdown(int l,int r,int p)

void add(int p,int l,int r,int

x,int

y,ll val)

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

if (x

<= mid)

add(p * 2, l, mid, x, std::min(y, mid), val);

if (y > mid)

add(p * 2 + 1, mid + 1, r, std::max(mid + 1, x), y, val);

t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;

}ll query(int p,int l,int r,int

x,int

y)ll query(int

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

return ans;

}int v[n];

int main()

dfs1(1,1,0);

dfs2(1,1);

for (int i = 1; i <= n; i++)

add(1, 1, n, pos[i], pos[i], v[i]);

int opt,x,a;

for (int i = 1; i <= m; i++)

if (opt == 2)

if (opt == 3)

printf("%lld\n",query(x));

}}

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

BZOJ4034 HAOI2015 樹上操作

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