題目描述 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#includeview code#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;
}
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 改...