jzoj3236 矮人排隊 權值線段樹

2021-09-25 04:24:23 字數 1634 閱讀 7853

乙個序列兩個操作

先不考慮交換,對於詢問我們發現它詢問的區間不固定所以很難用線段樹來做。所以我們可以用域值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 每個人高度互不相同 然而,由於不健康的生活方式,矮人的...