權值線段樹 JZOJ 3236 矮人排隊

2021-09-25 04:47:03 字數 1475 閱讀 8785

給出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 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...