傳送門
板子題
#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的路徑上的節點的權值和 注意 從點...