傳送門
小矮人們依據白雪公主的指令進行活動,我們需要做的是在一段移動後,高度連續的某些小矮人的位置是否也連續
因為涉及到區間詢問,所以我們自然而然的想到使用線段樹進行查詢
我們將線段樹的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 個可能...