P2590 ZJOI2008 樹的統計

2022-05-03 13:36:17 字數 2823 閱讀 8951

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

輸入樣例#1: 複製

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 4

輸出樣例#1: 複製

412

21065

6516

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

#include#include

#include

#include

#include

using

namespace

std;

const

int n=3e4+5

;const

int inf=599518803

;int

n,m;

intopt,x,y;

intw[n],bound;

inthead[n],num_edge;

struct

edge

edge[n

<<1

];struct

node

node[n];

struct

tree

tree[n

<<2

];typedef tree*tree;

tree now_node=tree,root;

inline

intread()

inline

void add_edge(int u,int

v)void dfs1(intu)}

void dfs2(int u,int

top)

}node[u].t=bound;

}void build(tree &root,int l,int

r)void update(const tree &root,int pos,int

k)

if(pos<=root->mid)

update(root->lson,pos,k);

else

update(root->rson,pos,k);

root->sum=root->lson->sum+root->rson->sum;

root->maxn=max(root->lson->maxn,root->rson->maxn);

}int query_sum(const tree &root,int l,int

r)int query_max(const tree &root,int l,int

r)int query_sum(int x,int

y)

else

}if(node[x].dep>node[y].dep)

ans+=query_sum(root,node[y].s,node[x].s);

else

ans+=query_sum(root,node[x].s,node[y].s);

return

ans;

}inline

int query_max(int x,int

y)

else

}if(node[x].dep>node[y].dep)

ans=max(ans,query_max(root,node[y].s,node[x].s));

else

ans=max(ans,query_max(root,node[x].s,node[y].s));

return

ans;

}char s[10

];int

main()

for(int i=1;i<=n;++i)

w[i]=read();

dfs1(1);

dfs2(

1,1);

build(root,

1,n);

for(int i=1;i<=n;++i)

update(root,node[i].s,w[i]);

m=read();

while(m--)

else

if(s[1]=='m'

)

else

}return0;

}

P2590 ZJOI2008 樹的統計

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

P2590 ZJOI2008 樹的統計

樹鏈剖分經典板子題,但是需要注意的是線段樹既要維護和還要維護區間最大值。第一次手搓還是很難。感覺還是不太熟練。以下是 a c includeusing namespace std const int maxn 1e5 5 define ll long long int inline ll read ...

P2590 ZJOI2008 樹的統計

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