題目: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
using
namespace
std;
const
int maxn=30010;
int to[maxn*2],next[maxn*2],begin[maxn],e;
void add(int x,int y)
int n,cnt;
int sz[maxn],son[maxn],top[maxn],fa[maxn];
int dep[maxn];
int id[maxn],tmp[maxn];
int val[maxn*4],max[maxn*4];
int sumans,maxans;
void maintain(int o,int l,int r)
void update(int o,int l,int r,int x,int y)
int mid=(l+r)>>1;
if(x<=mid) update(o<<1,l,mid,x,y);
else update(o<<1|1,mid+1,r,x,y);
maintain(o,l,r);
}void query(int o,int l,int r,int x,int y)
int mid=(l+r)>>1;
if(y<=mid) query(o<<1,l,mid,x,y);
else
if(x>mid) query(o<<1|1,mid+1,r,x,y);
else
}void dfs1(int u)
}void dfs2(int u)
}void solve(int u,int v)
if(dep[u]1,1,n,id[v],id[u]);
}int main()
for(int i=1;i<=n;i++) scanf("%d",&tmp[i]);
dep[1]=1;top[1]=1;
dfs1(1);
dfs2(1);
int q;
scanf("%d",&q);
int ans;
while(q--)else
}return
0;}
ZJOI2008 樹的統計(樹鏈剖分)
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...
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...
ZJOI 2008 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...