codevs2460 樹的統計

2022-05-26 19:36:15 字數 3159 閱讀 8940

題目描述 description

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。

我們將以下面的形式來要求你對這棵樹完成一些操作:

i.change u t :把結點u的權值改為t

ii.qmax u v:詢問從點u到點v的路徑上的節點的最大權值

iii.qsum u v:詢問從點u到點v的路徑上的節點的權值和

注意:從點u到點v的路徑上的節點包括u和v本身

輸入描述 input description

輸入檔案的第一行為乙個整數n,表示節點的個數。

接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。

接下來n行,每行乙個整數,第i行的整數wi表示節點i的權值。

接下來1行,為乙個整數q,表示操作的總數。

接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。

輸出描述 output description

對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。

樣例輸入 sample input

1 22 3

4 14 2 1 3

qmax 3 4

qmax 3 3

qmax 3 2

qmax 2 3

qsum 3 4

qsum 2 1

change 1 5

qmax 3 4

change 3 6

qmax 3 4

qmax 2 4

qsum 3 4

樣例輸出 sample output

資料範圍及提示 data size & hint

對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。

樹鏈剖分基礎題。順便練一練線段樹,這一回又加深了對線段樹的理解。

#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;#define mem(a,b) memset(a,b,sizeof(a))typedef pair

pii;

inline

intread()

while(isdigit(c))

return x*f;

}const

int maxn=30010,oo=2147483647

;struct

edge

edge(

int _1,int _2,int

_3): u(_1),v(_2),next(_3) {}

}e[2*maxn];

int n,ce=-1,m,a,b,first[maxn],sum[4*maxn],max[4*maxn],w[maxn],pa[maxn],deep[maxn],size[maxn],id[maxn],es,bl[maxn];

char s[10

];void addedge(int a,int

b)void dfs(int now,int

fa)}

void divide(int now,int

chain)

void build(int l,int r,int

o)

int mid=(l+r)>>1,lo=o<<1,ro=lo|1

; build(l,mid,lo);build(mid+1

,r,ro);

sum[o]=sum[lo]+sum[ro];

max[o]=max(max[lo],max[ro]);

}int query1(int l,int r,int o,int a,int

b)int query2(int l,int r,int o,int a,int

b)void update(int l,int r,int o,int a,int

b)

int mid=(l+r)>>1,lo=o<<1,ro=lo|1

;

if(a<=mid)update(l,mid,lo,a,b);

else update(mid+1

,r,ro,a,b);

sum[o]=sum[lo]+sum[ro];

max[o]=max(max[lo],max[ro]);

}int query(int a,int b,int

tp)

if(id[a]>id[b])swap(a,b);

if(tp)ans+=query1(1,n,1

,id[a],id[b]);

else ans=max(ans,query2(1,n,1

,id[a],id[b]));

return

ans;

}int

main()

dfs(

1,1);divide(1,1

);

for(int i=1;i<=n;i++)w[id[i]]=read();

build(

1,n,1);m=read();

while(m--)

return0;

}

view code

CS 2460 樹的統計(樹鏈剖分)

很經典的樹剖板子題目 題目傳送門 結果點了這裡直接去了題解空間 時間限制 2 s 空間限制 128000 kb 題目等級 大師 master 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ...

樹的種類統計

資料結構實驗之查詢三 樹的種類統計 time limit 400 ms memory limit 65536 kib submit statistic discuss problem description 隨著衛星成像技術的應用,自然資源研究機構可以識別每乙個棵樹的種類。請編寫程式幫助研究人員統計...

2590 樹的統計

看到lct的題解比較少,所以我來貢獻一篇 注意的地方and坑點 1.只用把mmax 0 維護的最大值 初始化為極小值 2.sum i mmax i 在輸入時就可賦值為val i 3.要先儲存下聯通的點,在輸入完val後再進行link操作 change操作 change x v 表示把 val x 改...