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