一棵樹上有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 線段樹等 來維護每一條鏈。那它有什麼用呢?它可以解決一些樹上路徑的一些問題。一般...