題目:樹的統計
思路:樹剖
參考:吊打集訓隊的zcy的**
幾乎是照著抄的……
資料生成器:
#include
using
namespace std;
#define maxn 10
#define maxm 10
#define maxa 10
#define rand() (rand()+rand()%19260817)
int fa[maxn+5]
=;intfind
(int x)
intmain()
int x=
find
(l),y=
find
(r);
fa[x]
=y;printf
("%d %d\n"
,l,r);}
for(
int i=
1; i<=n; i++
)printf
("%d "
,rand()
%maxn+1)
;printf
("\n%d\n"
,m);
while
(m--
)return0;
}
**:
有注釋版:
">using namespace std;
#define maxn 400000
#define inf (1<<30)
int n,m;
vectorg[maxn+5]; //原圖
int a[maxn+5]= ; //點權
int d[maxn+5],fa[maxn+5]; //深度、父節點
int sz[maxn+5],wson[maxn+5]; //子樹節點個數,重兒子
int pre[maxn+5]= ; //節點的新編號
int top[maxn+5]= ; //新編號對應的節點
int tpos[maxn+5]= //鏈頂的位置
int cnt=0; //計數器
int maxv[maxn+5]= ,sumv[maxn+5]= ; //區間最大值,區間和
void push_up(int o,int lch,int rch)
void update(int o,int l,int r,int p,int v)
int lch=o*2,rch=lch+1;
update(lch,l,mid,p,v),update(rch,mid+1,r,p,v);
push_up(o,lch,rch);
}void build(int o,int l,int r)
int mid=(r-l)/2+l;
int lch=o*2,rch=lch+1;
build(lch,l,mid),build(rch,mid+1,r);
push_up(o,lch,rch);
}void readin()
}void dfs2(int x,int tp)
for(int i=0; i無注釋精簡版:
#include
using
namespace std;
#define maxn 400000
#define inf (1<<30)
int n,m;
vector<
int> g[maxn+5]
;int a[maxn+5]
=;int d[maxn+5]
,fa[maxn+5]
;int sz[maxn+5]
,wson[maxn+5]
;int top[maxn+5]
=;int tpos[maxn+5]
=,pre[maxn+5]
=;int cnt=0;
int maxv[maxn+5]
=,sumv[maxn+5]
=;void
push_up
(int o,
int lch,
int rch)
void
update
(int o,
int l,
int r,
int p,
int v)
int lch=o*
2,rch=lch+1;
update
(lch,l,mid,p,v)
,update
(rch,mid+
1,r,p,v)
;push_up
(o,lch,rch);}
void
build
(int o,
int l,
int r)
int mid=
(r-l)/2
+l;int lch=o*
2,rch=lch+1;
build
(lch,l,mid)
,build
(rch,mid+
1,r)
;push_up
(o,lch,rch);}
void
readin()
for(
int i=
1; i<=n; i++
)scanf
("%d"
,&a[i]);
scanf
("%d"
,&m);}
void
dfs1
(int x,
int f)
}void
dfs2
(int x,
int tp)
for(
int i=
0; i.size()
; i++)}
intquerymax
(int o,
int l,
int r,
int p,
int q)
intquerym
(int u,
int v)
if(d[u]
)swap
(u,v)
; ans=
max(ans,
querymax(1
,1,n,tpos[v]
,tpos[u]))
;return ans;
}int
querysum
(int o,
int l,
int r,
int p,
int q)
intquerys
(int u,
int v)
if(d[u]
)swap
(u,v)
; ans+
=querysum(1
,1,n,tpos[v]
,tpos[u]);
return ans;
}int
main()
else
if(s[1]
=='m'
)else
if(s[1]
=='s')}
return0;
}
洛谷 P2590 ZJOI2008 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...
洛谷 P2590 ZJOI2008 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...
洛谷 P2590 ZJOI2008 樹的統計
一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.change u t 把結點u的權值改為t ii.qmax u v 詢問從點u到點v的路徑上的節點的最大權值 iii.qsum u v 詢問從點u到點v的路徑上的節點的權值和 注意 從點...