ZJOI2008 樹的統計

2022-05-07 18:48:09 字數 1496 閱讀 9638

[zjoi2008]樹的統計

=題目描述

一棵樹上有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」的操作,每行輸出乙個整數表示要求輸出的結果。

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

一到樹剖裸題,套個線段樹輕鬆ac(如果不會樹剖[戳我](**-

```#include

#define ll long long

#define il inline

#define rg register

#define mid ((l+r)>>1)

#define lc no<<1

#define rc no<<1|1

#define ls lc,l,mid

#define rs rc,mid+1,r

using namespace std;

il int gi()

const int n=1e6;

int a[n],nex[n],to[n],w[n],dfn[n],fa[n],top[n],son[n],size[n],sum[n],ma[n],n,q,cnt;

void dfs1(int u)

}void dfs2(int u,int top)

}void pushup(int no)

void build(int no,int l,int r)

build(ls);build(rs);

pushup(no);

}void update(int no,int l,int r,int u,int x)

if(u<=mid)update(ls,u,x);

else update(rs,u,x);

pushup(no);

}int query1(int no,int l,int r,int l,int r)

int main()

if(op=='s')}}

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的路徑上的節點的權值和 注意 從點...