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

2021-08-15 21:40:56 字數 1873 閱讀 4523

傳送門

板子題

#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];

int num_edge,head[maxn];

int dfn[maxn],idfn[maxn],fa[maxn],top[maxn],deep[maxn],tot[maxn],son[maxn];

void add_edge(int from,int to)

void dfs1(int

x,int father,int depth)}}

}int cnt;//標記dfs序的計數器

void dfs2(int

x,int tp)

}void pushup(int rt)

void build_tree(int l,int r,int rt)

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

build_tree(l,mid,rt<<1);

build_tree(mid+1,r,rt<<1|1);

pushup(rt);

}void change_point(int

pos,int c,int l,int r,int rt)

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

// pushdown(rt,mid-l+1,r-mid); pushdown_max(rt);

if (pos

<=mid) change_point(pos,c,l,mid,rt<<1);

else change_point(pos,c,mid+1,r,rt<<1|1);

pushup(rt);

}int ques_sum(int l,int r,int l,int r,int rt)

int ques_max(int l,int r,int l,int r,int rt)

int ques_tree_sum(int

x,int

y) if (deep[x]>deep[y])

swap(x,y);

ans+=ques_sum(dfn[x],dfn[y],1,n,1);

return ans;

}int ques_tree_max(int

x,int

y) if (deep[x]>deep[y]) swap(x,y);

ans=max(ans,ques_max(dfn[x],dfn[y],1,n,1));

return ans;

}int main()

for (int i=1; i<=n; i++) scanf("%d",&a[i]);

scanf("%d",&m);

dfs1(1,1,1);

dfs2(1,1);

build_tree(1,n,1);

for (int i=1; i<=m; i++)

return

0;}

我真是太菜了

這棵線段樹里的點的編號是由dfs序得到的,傳進點的編號時應該是 dfn【】;這個東西調了一上午!!a[idfn[l]]才是原來的數

可能有負權 所以要ques裡面ans要初始化為-inf每次詢問完成都要pushup!到現在還沒有a掉 ac %%%% sheng hao

ZJOI2008 樹的統計(樹鏈剖分)

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

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