給出n
nn個人的身高,有兩種操作:
1 、1、
1、交換兩人位置。
2 、2、
2、查詢a ∼b
a\sim b
a∼b這些身高的人在序列中是否是乙個連續子串行。
一開始我用線段樹記錄當前區間的最大值和最小值,然後查詢時就把在a∼b
a\sim b
a∼b的區間拿出來,暴力判斷一下是否連續,事實證明我是∗∗**
∗∗。其實要用線段樹維護高度為i
ii的人位置在哪,以及區間最大最小值,在查詢時,我們利用線段樹判斷一下當前區間最大位置-最小位置是否等於查詢的人的總數。
#include
#include
struct segmenttree t[
800001];
int n, m, f;
int a[
200001
], h[
200001];
void
build
(int p,
int l,
int r)
int mid = l + r >>1;
build
(p *
2, l, mid)
;build
(p *2+
1, mid +
1, r)
; t[p]
.mins = std::
min(t[p *2]
.mins, t[p *2+
1].mins)
; t[p]
.maxs = std::
max(t[p *2]
.maxs, t[p *2+
1].maxs);}
void
change
(int p,
int pos,
int v)
int mid = t[p]
.l + t[p]
.r >>1;
if(pos <= mid)
change
(p *
2, pos, v)
;else
change
(p *2+
1, pos, v)
; t[p]
.mins = std::
min(t[p *2]
.mins, t[p *2+
1].mins)
; t[p]
.maxs = std::
max(t[p *2]
.maxs, t[p *2+
1].maxs);}
std::pair<
int,
int>
ask(
int p,
int l,
int r)
intmain()
else
}}
jzoj3236 矮人排隊 權值線段樹
乙個序列兩個操作 先不考慮交換,對於詢問我們發現它詢問的區間不固定所以很難用線段樹來做。所以我們可以用域值i ii維護i ii再目前序列的哪個位置。然後維護區間最大值和最小值,然後若詢問b a b ab a等於a b a sim b a b這個區間的max n mi nn maxn minn max...
JZOJ 3236 矮人排隊 線段樹
傳送門 小矮人們依據白雪公主的指令進行活動,我們需要做的是在一段移動後,高度連續的某些小矮人的位置是否也連續 因為涉及到區間詢問,所以我們自然而然的想到使用線段樹進行查詢 我們將線段樹的l r l rl r區間用來表示高度在l r l rl r內的小矮人,並維護他們的最左和最右的位置 因為如果位置是...
權值線段樹
維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...