ZJOI2008樹的計算 樹鏈剖分

2021-07-26 04:20:23 字數 1330 閱讀 6939

題目: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的路徑上的節點的權值和 注意 從點...