ZJOI2008 樹的統計Count

2021-07-25 08:48:14 字數 1782 閱讀 4099

time limit: 10 sec  memory limit: 162 mb

submit: 14294  solved: 5776

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成

一些操作: i. change u t : 把結點u的權值改為t ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值 i

ii. 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」的形式給出。

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

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

1 22 3

4 14 2 1 3

12qmax 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 441

22106

56516

樹剖裸題,參照hzwer**。

#include

#define inf 1234567890;

#define n 30005

#define m 60005

using namespace std;

int n,q,sz,id;

int v[n],deep[n],size[n],head[n],fa[n];

int pos[n],bl[n];

struct datae[m];

struct segt[100005];

int read()

void add(int u,int v)

void init()

if (k==0) return;

dfs2(k,chain);

for (int i=head[u];i;i=e[i].next)

}void build(int k,int l,int r)

int max(int a,int b)

void change(int k,int x,int y)

if (x<=mid) change(k<<1,x,y);

else change(k<<1|1,x,y);

t[k].sum=t[k<<1].sum+t[k<<1|1].sum;

t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx);    

}int qsm(int k,int x,int y)

int qmx(int k,int x,int y)

void swap(int &a,int &b)

int ssm(int x,int y)

int smx(int x,int y)

void solve()

else }}

int main()

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