JZOJ 3236 矮人排隊 線段樹

2021-09-25 04:40:52 字數 1651 閱讀 5218

傳送門

小矮人們依據白雪公主的指令進行活動,我們需要做的是在一段移動後,高度連續的某些小矮人的位置是否也連續

因為涉及到區間詢問,所以我們自然而然的想到使用線段樹進行查詢

我們將線段樹的l、r

l、rl、

r區間用來表示高度在l—r

l—rl—

r內的小矮人,並維護他們的最左和最右的位置

因為如果位置是連續的,那麼就必然會有最右−

最左=r

−l

最右-最左=r-l

最右−最左=

r−l

#pragma gcc optimize("ofast")

#pragma gcc optimize("inline")

#include

#include

#include

#include

#include

#define ll long long

using namespace std;

inline ll read()

while

(s>=

'0'&&s<=

'9')

return d*f;

}struct marmottree[

800050];

ll w[

200005];

void

kill

(ll k)

void

build

(ll k,ll l,ll r)

ll mid=

(l+r)

>>1;

build

(k*2

,l,mid)

;build

(k*2+1

,mid+

1,r)

;kill

(k);

return;}

void

change

(ll k,ll x,ll y)

ll mid=

(tree[k]

.l+tree[k]

.r)>>1;

if(x<=mid)

change

(k*2

,x,y)

;else

change

(k*2+1

,x,y)

;kill

(k);

return;}

ll minl,maxr;

void

ask(ll k,ll l,ll r)

ll mid=

(tree[k]

.l+tree[k]

.r)>>1;

if(r<=mid)

ask(k*

2,l,r)

;else

if(l>mid)

ask(k*2+

1,l,r)

;else

ask(k*

2,l,mid)

,ask

(k*2+1

,mid+

1,r)

;return;}

ll nb[

200005];

intmain()

else

}return0;

}

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 矮人排隊

給出n nn個人的身高,有兩種操作 1 1 1 交換兩人位置。2 2 2 查詢a b a sim b a b這些身高的人在序列中是否是乙個連續子串行。一開始我用線段樹記錄當前區間的最大值和最小值,然後查詢時就把在a b a sim b a b的區間拿出來,暴力判斷一下是否連續,事實證明我是 其實要用...

jzoj1278 排隊(線段樹)

1278.排隊 description 每天,農夫 john 的n 1 n 50,000 頭牛總是按同一序列排隊.有一天,john決定讓一些牛們玩一場飛盤比賽.他準備找一群在對列中為置連續的牛來進行比賽.但是為了避免水平懸殊,牛的身高不應該相差太大.john 準備了q 1 q 180,000 個可能...