Bzoj1036 樹的統計

2021-07-28 08:48:12 字數 1522 閱讀 3685

一棵

樹上有n

個節點,

編號分別

為1到n

,每個節

點都有一

個權值w

。我們將

以下面的

形式來要

求你對棵

樹完成一

些操作:

1.把結

點u的權

值改為t

2.詢問

從點u到

點v的路

徑上的節

點的最大

權值3.詢問

從點u到

點v的路

徑上的節

點的權值

和 注意

:從點u

到點v的

路徑上的

節點包括

u和v本

身 n<=30000 ,t<=200000

樹鏈剖分的模板,兩個操作可以合併,減少程式設計難度。

#include 

#include

using

namespace

std;

const

int maxx = 30000 + 25;

const

int inf = (unsigned)(-1)>>1;

int head[maxx],to[maxx<<1],nxt[maxx<<1];

int a[maxx],dpt[maxx],rnk[maxx],size[maxx],ftr[maxx],top[maxx],son[maxx];

int t[maxx<<2],tmax[maxx<<2];

int n,m,cnt,t,x,y,num;

char flag[8];

void add(int x,int y)

void chk(int pos,int &a,int b)

namespace y

}void dfs2(int x,int brn)

void modify(int i,int l,int r,int pos,int k)

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

if(pos <= mid) modify(i<<1,l,mid,pos,k);

if(pos > mid) modify(i<<1|1,mid+1,r,pos,k);

t[i]=t[i<<1]+t[i<<1|1];tmax[i]=max(tmax[i<<1],tmax[i<<1|1]);

}int query(int i,int x,int y,int l,int r,int flag)

int solve(int flag,int x,int y)

if(rnk[x] > rnk[y]) x^=y^=x^=y;

chk(flag,ans,query(1,rnk[x],rnk[y],1,n,flag));

return ans;

}}using

namespace y;

int main()

return

0;}

bzoj1036 樹的統計

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

bzoj 1036 樹的統計

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

BZOJ1036 樹的統計

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