ZJOI2008 樹的統計(樹鏈剖分)

2021-08-07 09:16:21 字數 2442 閱讀 8564

一棵樹上有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」的形式給出。 對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。

對於每個「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

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 50000

#define inf 1000000000

#define lson (now<<1)

#define rson ((now<<1)|1)

inline

int read()

while(ch>='0'&&ch<='9')

return x*t;

}struct line

e[max*2];

int h[max],cnt=1,tim,dfn[max],low[max],hson[max],f[max];

int top[max],size[max],dep[max];

int n,line[max],v[max];

struct node

c[max*4];

inline

void add(int u,int v)

; h[u]=cnt++;

}void dfs1(int u,int ff)

}void dfs2(int u,int tp)

low[u]=tim;

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

int mid=(l+r)>>1;

build(lson,l,mid);build(rson,mid+1,r);

c[now].val=c[lson].val+c[rson].val;

c[now].mm=max(c[lson].mm,c[rson].mm);

}void update(int now,int l,int r,int k,int w)

int mid=(l+r)>>1;

if(k<=mid)update(lson,l,mid,k,w);

else update(rson,mid+1,r,k,w);

c[now].val=c[lson].val+c[rson].val;

c[now].mm=max(c[lson].mm,c[rson].mm);

}int query1(int now,int l,int r,int al,int ar)

int query2(int now,int l,int r,int al,int ar)

int answer1(int u,int v)

if(dep[u]1,1,n,dfn[v],dfn[u]);

return ans;

}int answer2(int u,int v)

if(dep[u]1,1,n,dfn[v],dfn[u]),ans);

return ans;

}int main()

dfs1(1,0);dfs2(1,1);

for(int i=1;i<=n;++i)v[i]=read();

build(1,1,n);

int q=read();

while(q--)

}

ZJOI2008 樹的統計(樹鏈剖分 線段樹)

傳送門 板子題 include include include using namespace std const int maxn 1000005 int n,m,x,y,a maxn sum maxn 2 add maxn 2 maxq maxn struct edgeedge maxn 1 i...

ZJOI2008樹的計算 樹鏈剖分

題目 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點u到點v的路徑上的節點包括u和v本身 include include include include u...

ZJOI 2008 樹的統計

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