洛谷P2590 樹的統計 樹鏈剖分入門

2021-09-25 07:49:48 字數 3399 閱讀 2581

一棵樹上有n

nn個節點,編號分別為1

11到n

nn,每個節點都有乙個權值www。

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

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

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

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

樹剖裸題,只不過需要多維護點東西。

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

int maxn =

3e4+5;

const

int maxm =

100+5;

const

int inf =

0x3f3f3f3f

;const ll mod =

1e9+7;

//19260817

const

double pi =

acos(-

1.0)

;int n, x, y, q, cnt, tot, w[maxn]

, head[maxn]

;int id[maxn]

, pre[maxn]

, son[maxn]

, size[maxn]

, deep[maxn]

, top[maxn]

, nw[maxn]

;char str[20]

;struct nodeedge[maxn <<1]

;struct qwqa[maxn <<2]

;void

pushup

(int k)

void

build

(int k,

int l,

int r)

int mid =

(l + r)

>>1;

build

(k <<

1, l, mid)

;build

(k <<1|

1, mid +

1, r)

;pushup

(k);

}void

update

(int k,

int l,

int r,

int x,

int z)

int mid =

(l + r)

>>1;

if(x <= mid)

update

(k <<

1, l, mid, x, z);if

(x > mid)

update

(k <<1|

1, mid +

1, r, x, z)

;pushup

(k);

}int

querymax

(int k,

int l,

int r,

int x,

int y)

int mid =

(l + r)

>>

1, ans =

-inf;

if(x <= mid) ans =

max(ans,

querymax

(k <<

1, l, mid, x, y));

if(y > mid) ans =

max(ans,

querymax

(k <<1|

1, mid +

1, r, x, y));

return ans;

}int

querysum

(int k,

int l,

int r,

int x,

int y)

int mid =

(l + r)

>>

1, ans =0;

if(x <= mid) ans +

=querysum

(k <<

1, l, mid, x, y);if

(y > mid) ans +

=querysum

(k <<1|

1, mid +

1, r, x, y)

;return ans;

}void

addedge

(int u,

int v)

void

dfs1

(int x,

int f,

int d)

}void

dfs2

(int x,

int topf)

}int

querymax

(int x,

int y)

if(deep[x]

> deep[y]

)swap

(x, y)

; ans =

max(ans,

querymax(1

,1, n, id[x]

, id[y]))

;return ans;

}int

querysum

(int x,

int y)

if(deep[x]

> deep[y]

)swap

(x, y)

; ans +

=querysum(1

,1, n, id[x]

, id[y]);

return ans;

}int

main()

for(

int i =

1; i <= n; i++

)scanf

("%d"

, w + i)

;dfs1(1

,-1,

1);dfs2(1

,1);

build(1

,1, n)

;scanf

("%d"

,&q)

;while

(q--

)elseif(

strcmp

(str,

"qsum")==

0)elseif(

strcmp

(str,

"qmax")==

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

樹鏈剖分 洛谷 P3384 模板 樹鏈剖分

step1 problem 題目 給你一棵n個點樹,m個操作,r是根,結果取模mod.操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根節點的子樹內所有節...

樹鏈剖分簡介(BZOJ1036)(洛谷2590)

建議學樹剖的同學先學會dfs序,並有一定的資料結構基礎 樹鏈剖分,計算機術語,指一種對樹進行劃分的演算法,它先通過輕重邊剖分將樹分為多條鏈,保證每個點屬於且只屬於一條鏈,然後再通過資料結構 樹狀陣列 sbt splay 線段樹等 來維護每一條鏈。那它有什麼用呢?它可以解決一些樹上路徑的一些問題。一般...