洛谷 P2590 ZJOI2008 樹的統計

2021-08-22 12:05:24 字數 3617 閱讀 9865

題目:樹的統計

思路:樹剖

參考:吊打集訓隊的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的路徑上的節點的權值和 注意 從點...