ZJOI2008 樹的統計

2021-08-15 09:17:11 字數 2344 閱讀 4999

一棵樹上有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本身

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

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

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

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

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

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

4 1 2

2 3

4 1

4 2 1 3

12 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

4 1

2 2

10 6

5 6

5 16

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

這是一道樹鏈剖分十分經典的題目,

鏈剖之後,用線段樹維護最大值還有和,

單點修改,詢問就在找lca的時候順便記錄一下就行了。

關於樹鏈剖分,請看樹鏈剖分詳解。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 30003

#define m 103

#define db double

#define p putchar

#define g getchar

#define inf 998244353

using namespace std;

char ch;

void read(int &n)

int max(int a,int b)

int min(int a,int b)

ints

qr(int x)

void write(int

x)int mx[n*4],s[n*4],l[n*4],r[n*4],v[n];

int nxt[n*2],to[n*2],lst[n],tot;

int si[n],top[n],son[n],dep[n],fa[n],id[n],rank[n],now;

int n,x,y,xx,yy,q,opl,opr,ops,opx;

void ins(int

x,int

y)void dfs(intx)}

void dfs_(int

x,int t)

void updata(int

x)void build(int

x,int ll,int rr)

intm=(ll+rr)>>1;

build(x

<<1,ll,m);

build((x

<<1)+1,m+1,rr);

updata(x);

}void work(int

x) int

m=(l[x]+r[x])>>1;

if(opl<=m)work(x

<<1);

if(m

x<<1)+1);

updata(x);

}int main()

else

else

opl=id[x];

opr=id[y];

if(opl>opr)swap(opl,opr);

work(1);

if(ops<0)p('-'),write(-ops);else

write(ops);

p('\n');}}

return

0;}

ZJOI 2008 樹的統計

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...

ZJOI2008 樹的統計

zjoi2008 樹的統計 題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到...

ZJOI2008 樹的統計

題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 ...