洛谷P2590 ZJOI2008 樹的統計

2022-05-31 04:48:11 字數 3375 閱讀 4565

題目:

一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。

我們將以下面的形式來要求你對這棵樹完成一些操作:

i. change u t : 把結點u的權值改為t

ii. qmax u v: 詢問從點u到點v的路徑上的節點的最大權值

iii. qsum u v: 詢問從點u到點v的路徑上的節點的權值和

注意:從點u到點v的路徑上的節點包括u和v本身

輸入格式:

輸入檔案的第一行為乙個整數n,表示節點的個數。

接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。

接下來一行n個整數,第i個整數wi表示節點i的權值。

接下來1行,為乙個整數q,表示操作的總數。

接下來q行,每行乙個操作,以「change u t」或者「qmax u v」或者「qsum u v」的形式給出。

輸出格式:

對於每個「qmax」或者「qsum」的操作,每行輸出乙個整數表示要求輸出的結果。

輸入樣例#1: 

4

1 22 3

4 14 2 1 3

12qmax 3 4

qmax 3 3

qmax 3 2

qmax 2 3

qsum 3 4

qsum 2 1

change 1 5

qmax 3 4

change 3 6

qmax 3 4

qmax 2 4

qsum 3 4

輸出樣例#1: 

412

21065

6516

對於100%的資料,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。

這個。。。沒有啥可解析的吧。。。。。。

樹剖版題。

我終於寫對了乙個樹剖啦。。。。。。

(我還是太菜了)

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int n=30500;9

const

int m=70500;10

const

int inf=233333333;11

12 vectoredge[n];

1314

intn,m,ra,rb;

15int

val[n];

16int

fa[n],tot[n],depth[n];

17int

top[n],num[n],numx[n],t;

1819

struct

node;

22node tree[m];

2324

void addedge(int x,int

y)28

29void dfsa(int

x)39}40

}4142void dfsb(int

x)53

if(big)

57for (int i=0;ii)62}

6364

void maketree(int o,int l,int

r)70

int ls=o<<1;71

int rs=ls|1;72

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

maketree(ls,l,mid);

74 maketree(rs,mid+1

,r);

75 tree[o].sum=tree[ls].sum+tree[rs].sum;

76 tree[o].maxv=max(tree[ls].maxv,tree[rs].maxv);77}

7879

void change(int o,int l,int r,int a,int

v)84

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

int ls=o<<1;86

int rs=ls|1;87

if (a<=mid) change(ls,l,mid,a,v);

88else change(rs,mid+1

,r,a,v);

89 tree[o].maxv=max(tree[ls].maxv,tree[rs].maxv);

90 tree[o].sum=tree[ls].sum+tree[rs].sum;91}

9293

int getsum(int o,int l,int r,int ql,int

qr)103

int getmax(int o,int l,int r,int ql,int

qr)113

114int findmax(int a,int

b)120 res=max(res,getmax(1,1

,n,num[top[a]],num[a]));

121 a=fa[top[a]];

122}

123if (depth[a]>depth[b]) swap(a,b);

124 res=max(res,getmax(1,1

,n,num[a],num[b]));

125return

res;

126}

127int findsum(int a,int

b)133 res+=getsum(1,1

,n,num[top[a]],num[a]);

134 a=fa[top[a]];

135}

136if (depth[a]>depth[b]) swap(a,b);

137 res+=getsum(1,1

,n,num[a],num[b]);

138return

res;

139}

140141

intmain()

147for (int i=1;i<=n;++i)

148 scanf("

%d",&val[i]);

149 dfsa(1

);150 dfsb(1

);151 maketree(1,1

,n);

152 scanf("

%d",&m);

153char re[10

];154

while (m--)

160return0;

161 }

view code

洛谷 P2590 ZJOI2008 樹的統計

題目 樹的統計 思路 樹剖 參考 吊打集訓隊的zcy的 幾乎是照著抄的 資料生成器 include using namespace std define maxn 10 define maxm 10 define maxa 10 define rand rand rand 19260817 int ...

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