洛谷P3178 HAOI2015 樹上操作

2021-09-08 05:05:29 字數 2685 閱讀 7447

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

輸入格式:

第一行包含兩個整數 n, m 。表示點數和運算元。接下來一行 n 個整數,表示樹中節點的初始權值。接下來 n-1 行每行兩個正整數 from, to , 表示該樹中存在一條邊 (from, 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 。

樹鏈剖分的裸題

每次暴力更改就好

注意這題需要開long long

#include#include

#include

#define ls k<<1

#define rs k<<1|1

#define ll long long

using

namespace

std;

const ll maxn=1e6+10

;inline

char

nc()

inline ll read()

while(c>='

0'&&c<='9')

return x*f;

}ll root=1

;struct

node

edge[maxn];

ll head[maxn];

ll num=1

;inline

void

addedge(ll x,ll y)

struct

tree

t[maxn];

ll a[maxn],b[maxn],tot[maxn],idx[maxn],deep[maxn],son[maxn],top[maxn],fa[maxn],cnt=0

;void

update(ll k)

void

pushdown(ll k)

ll dfs1(ll now,ll f,ll dep)

return

tot[now];

}void

dfs2(ll now,ll topf)

void

build(ll k,ll ll,ll rr)

ll mid=(ll+rr)>>1

; build(ls,ll,mid);

build(rs,mid+1

,rr);

update(k);

}void

pointadd(ll k,ll pos,ll val)

pushdown(k);

ll mid=(t[k].l+t[k].r)>>1

;

if(pos<=mid) pointadd(ls,pos,val);

if(pos>mid) pointadd(rs,pos,val);

update(k);

}void

intervaladd(ll k,ll ll,ll rr,ll val)

pushdown(k);

ll mid=(t[k].l+t[k].r)>>1

;

if(ll<=mid) intervaladd(ls,ll,rr,val);

if(rr>mid) intervaladd(rs,ll,rr,val);

update(k);

}ll intervalask(ll k,ll ll,ll rr)

pushdown(k);

ll mid=(t[k].l+t[k].r)>>1

;

if(ll<=mid) ans+=intervalask(ls,ll,rr);

if(rr>mid) ans+=intervalask(rs,ll,rr);

return

ans;

}ll treesum(ll x,ll y)

if(deep[x]>deep[y]) swap(x,y);

ans+=intervalask(1

,idx[x],idx[y]);

return

ans;

}int

main()

dfs1(root,

0,1);

dfs2(root,root);

build(

1,1,n);

while(m--)

else

if(opt==2

)

else

}return0;

}

洛谷 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...

洛谷 P3178 HAOI2015 樹上操作

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