乙個序列兩個操作
先不考慮交換,對於詢問我們發現它詢問的區間不固定所以很難用線段樹來做。所以我們可以用域值i
ii維護i
ii再目前序列的哪個位置。然後維護區間最大值和最小值,然後若詢問b−a
b-ab−
a等於a∼b
a\sim b
a∼b這個區間的max
n−mi
nn
maxn-minn
maxn−m
inn那麼這些是乙個連續區間。
然後交換我們定義seg
iseg_i
segi
表示在i
ii這個位置的數,然後就直接根據這個修改線段樹然後交換。
#include
#include
#include
using
namespace std;
const
int n=
201000
;int n,m,id[n]
,seg[n]
,rea,rei;
struct tree_node
;struct seg_tree
void
build
(int x,
int l,
int r)
int mid=
(l+r)/2
;build
(x*2
,l,mid)
;build
(x*2+1
,mid+
1,r)
;updata
(x,x*
2,x*2+
1);}
void
ask(
int x,
int l,
int r)
if(r<=t[x*2]
.r)ask
(x*2
,l,r)
;else
if(l>=t[x*2+
1].l)ask
(x*2+1
,l,r)
;else
ask(x*
2,l,t[x*2]
.r),
ask(x*2+
1,t[x*2+
1].l,r);}
void
change
(int x,
int pos,
int z)
if(pos<=t[x*2]
.r)change
(x*2
,pos,z)
;else
change
(x*2+1
,pos,z)
;updata
(x,x*
2,x*2+
1);}
}tree;
void
query
(int l,
int r)
void
swap
(int x,
int y)
intmain()
tree.
build(1
,1,n);
while
(m--
)else
}}
JZOJ 3236 矮人排隊 線段樹
傳送門 小矮人們依據白雪公主的指令進行活動,我們需要做的是在一段移動後,高度連續的某些小矮人的位置是否也連續 因為涉及到區間詢問,所以我們自然而然的想到使用線段樹進行查詢 我們將線段樹的l r l rl r區間用來表示高度在l r l rl r內的小矮人,並維護他們的最左和最右的位置 因為如果位置是...
權值線段樹 JZOJ 3236 矮人排隊
給出n nn個人的身高,有兩種操作 1 1 1 交換兩人位置。2 2 2 查詢a b a sim b a b這些身高的人在序列中是否是乙個連續子串行。一開始我用線段樹記錄當前區間的最大值和最小值,然後查詢時就把在a b a sim b a b的區間拿出來,暴力判斷一下是否連續,事實證明我是 其實要用...
排隊 白雪公主與n個小矮人
問題描述 在七山七海之外的乙個小村莊,白雪公主與n個矮人住在一起,所有時間都花在吃和玩league of legend遊戲。白雪公主決心終結這樣的生活,所以為他們舉辦了體育課。在每節課開始時,矮人必須按他們的身高站隊。假定矮人們有高度1,2,n 每個人高度互不相同 然而,由於不健康的生活方式,矮人的...