bzoj4358 permu 回滾莫隊

2021-09-25 23:00:42 字數 2903 閱讀 3237

序列上的問題?想到莫隊。

然而這題像bzoj4241 歷史研究一樣毒瘤,資瓷o(1

)o(1)

o(1)

加入,不資瓷o(1

)o(1)

o(1)

刪除。安利一波題解:bzoj4241 歷史研究qwq

所以像4241一樣,需要用到回滾莫隊。

這裡開兩個陣列l,r

l,rl,

r,l[i]

l[i]

l[i]

表示加入i時,i

ii到值域連續段左端有多少個數,r[i

]r[i]

r[i]

表示加入i時,i

ii到值域連續段右端有多少個數。

加入乙個數x

xx時,除了l[x

],r[

x]

l[x],r[x]

l[x],r

[x]要修改,還要修改x

xx所在的值域連續段的左端和右端(以保證下一次更新不會出錯)

然後就像回滾莫隊的普通操作一樣,對於每個塊,求解左端點在塊中的詢問的答案,詢問完後撤銷左端點的操作。

因為這裡加入乙個數x

xx時不只更新了l[x

]l[x]

l[x]

和r [x

]r[x]

r[x]

,所以要開乙個棧儲存更新了哪些位置和更新前的值。

然後撤銷就大力pop

poppo

p就珂以了qwq。

p s.

ps.ps

.這段**在bzo

jbzoj

bzoj

上過了,本地也跑過了所有資料,但是在毒瘤czh

czhcz

h的oj

ojoj

上就莫名爆0

00 qwq

大概是rprp

rp又不夠了,感覺可以從孟孫那裡吸一些rprp

rp

#include

#include

#include

#include

#define re register int

#define rl register ll

using

namespace std;

typedef

long

long ll;

intread()

while

(ch>=

'0'&& ch<=

'9')

return x*f;

}namespace i_love q[size]

;inline

bool

comp

(query x,query y)

int tmpl[size]

,tmpr[size]

,tp,stkl[size]

,stkr[size]

;int

baoli

(int l,

int r)

//要更新a[i]所在的值域連續段的左右端點

tmpl[a[i]

+tmpr[a[i]]-

1]=now;

tmpr[a[i]

-tmpl[a[i]]+

1]=now;

//加到棧中

stkl[

++tp]

=a[i]

+tmpr[a[i]]-

1;stkr[tp]

=a[i]

-tmpl[a[i]]+

1;stkl[

++tp]

=a[i]

; stkr[tp]

=a[i];}

while

(tp)

return nowmax;

}int lpos[size]

,rpos[size]

;int ans,out[size]

;struct stack

} s;

void

add(

int x,

bool flag)

if(flag)

lpos[x+rpos[x]-1

]=now;

rpos[x-lpos[x]+1

]=now;

}void

del(

)void

fujibayashi_ryou()

for(re i=

1; i<=m; i++

)sort

(q+1

,q+1

+m,comp)

;int num=belong[n]

,now=0;

for(re i=

1; i<=num; i++

)//右邊的操作是不用撤銷的

while

(r.r)add

(a[++r],0

);int pre=ans;

while

(l>q[j]

.l)add

(a[--l],1

);out[q[j]

.id]

=ans;

while

(s.top)

del();

while

(l<=blockr)

lpos[a[l]

]=rpos[a[l++]]

=0; ans=pre;

now=j;}}

for(re i=

1; i<=m; i++)}

}int

main()

/*9 3

2 4 3 6 1 5 8 9 7

3 52 6

1 4*/

bzoj4241 歷史研究 回滾莫隊

ioi國歷史研究的第一人 joi教授,最近獲得了乙份被認為是古代ioi國的住民寫下的日記。joi教授為了通過這份日記來研究古代ioi國的生活,開始著手調查日記中記載的事件。日記中記錄了連續n天發生的時間,大約每天發生一件。事件有種類之分。第i天 1 i n 發生的事件的種類用乙個整數xi表示,xi越...

bzoj4241 歷史研究 回滾莫隊

題目大意 給定乙個長度為n nn的序列,有q qq個詢問,要求回答區間 l,r l,r l,r 內,出現過的權值與其出現次數的積的最大值。n m 1 05 n,m 10 5 n,m 1 05首先這道題一看就是莫隊qwq 然後發現如果只有插入操作是很容易的,珂以直接o n n o n sqrt o n...

BZOJ4241 歷史研究 回滾莫隊

題目描述 給出乙個長度為 n 的陣列,每次詢問區間 l,r 求 max limits x cnt x 其中 cnt x 表示 x 在區間 l,r 的出現次數。資料範圍 n le 10 5,a i le 10 9 分塊也可以做到 o n sqrt 但是空間也是 o n sqrt 使用回滾莫隊可以在 o...