洛谷 P3178 HAOI2015 樹上操作

2022-04-10 15:51:36 字數 2396 閱讀 3949

有一棵點數為 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 ) 。

輸出格式:

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

輸入樣例#1:

5 5

1 2 3 4 5

1 21 4

2 32 5

3 31 2 1

3 52 1 2

3 3

輸出樣例#1:

6

913

對於 100% 的資料, n,m<=100000 ,且所有輸入資料的絕對值都不

會超過 10^6 。

樹剖模板練習

1 #include 2 #include 3

4#define ll long long56

using

namespace

std;78

const ll n(100000+15);9

const ll m(100000+15

);10

ll n,m,u,v,w,op,val[n];

1112

ll head[n],sumedge;

13struct

edge

1418 }edge[m<<1

];19 inline void

ins(ll u,ll v)

2024

25ll size[n],deep[n],dad[n],son[n],top[n],dfn[n],id[n],cnt;

26void

dfs(ll x,ll father,ll deepth)

2739}40

void

dfs_(ll x,ll top)

4150}51

52struct

tree

53tree[n<<2

];56 inline void

tree_up(ll now)

5760

void

tree_down(ll now)

6168

void

tree_build(ll now,ll l,ll r)

6976 tree[now].mid=l+r>>1

;77 tree_build(now<<1

,l,tree[now].mid);

78 tree_build(now<<1|1,tree[now].mid+1

,r);

79tree_up(now);80}

81void

tree_change(ll now,ll l,ll r,ll x)

8290

if(tree[now].flag) tree_down(now);

91if(tree[now].mid>=r) tree_change(now<<1

,l,r,x);

92else

if(tree[now].mid1|1

,l,r,x);

93else

9498

tree_up(now);99}

100 ll tree_query(ll now,int l,int

r)101

109110

ll list_query(ll x,ll y)

111118

if(deep[x]119 ret+=tree_query(1

,id[y],id[x]);

120return

ret;

121}

122123

intif_,ch;

124 inline void read (ll &x)

125133

134int

main()

135144 dfs(1,0,1);dfs_(1,1

);145 tree_build(1,1

,n);

146for(;m--;)

147154

else

if(op==2

)155

159else

160164

}165

return0;

166 }

洛谷P3178 HAOI2015 樹上操作

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

洛谷 P3178 HAOI2015 樹上操作

這篇題解原發於我的blog 這是一道樹鏈剖分的板子題,純粹的模板題事實上模板題比他難 事實上只要做過這道題p3384 模板 樹鏈剖分就可以我把題目難度提公升了 畢竟我是剛切完板子題的人,初生牛犢不怕虎,直接再打一遍練練手被逼的 記住因為這題沒有提供取模的數,因為 10 6 times10 5 2 1...

洛谷P3178 HAOI 2015 樹上操作

題目 樹剖裸題,這個題更可以深刻的理解樹剖中把樹上的節點轉換為區間的思想。要注意在區間上連續的節點,一定是在一棵子樹中。include define int long long define ls left,mid,root 1 define rs mid 1,right,root 1 1 defi...