bzoj4241 歷史研究 回滾莫隊

2021-09-25 22:35:56 字數 2698 閱讀 9443

題目大意:

給定乙個長度為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(nn​)

莫隊硬搞。

然而莫隊肯定是要刪除的,但是這裡如果按常規的莫隊寫,刪除操作是不能o(1

)o(1)

o(1)

得到次小值的。

於是我們珂以考慮上網搜題解qwq

搜出來乙個叫回滾莫隊的東西……

意思就是按照常規排序順序對詢問的區間排序(以左端點所在塊為第一關鍵字,右端點為第二關鍵字)

對於每乙個塊,分別求解區間左端點在塊中的詢問的答案。

首先,如果左右端點在同乙個塊中,直接暴力求解,時間複雜度o(n

).

o(\sqrt).

o(n​).

因為排序中,左端點所在塊一樣時按右端點從小到大排序,所以求解左端點在同乙個塊的查詢時,右端點是遞增的。

因此這樣可以讓區間右邊不出現刪除操作。

考慮區間左邊怎麼做:

不難發現,區間的左端點聚集在乙個長度為n

\sqrt

n​的塊內。

所以先讓l

ll在這個塊的最右端,處理完右邊的操作後,把答案儲存在乙個變數pre

prepr

e裡,令此時的區間為[pr

el,r

].

[prel,r].

[prel,

r].對於每個詢問,按照普通莫隊的方法不斷地往左推,把得到的答案ans

ansan

s儲存下來。

然後撤銷這些操作,即把剛剛更新的操作暴力清除,清除過程中ans

ansan

s不變。

發現清除後,區間仍然為[pr

el,r

][prel,r]

[prel,

r],因此珂以直接把ans

ansan

s賦值為pre

prepr

e了qwq。

寫的時候要注意邊界條件和初始化……被坑了幾次qaq

#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;

}void

write

(int x)

namespace i_love q[size]

;inline

bool

comp

(query x,query y)

ll ans,vis[size]

,out[size]

;inline

void

add(

int x)

}inline

void

del(

int x)

ll tmp[size]

;ll baoli

(int l,

int r)

ll tot=0;

for(re i=l; i<=r; i++)}

for(re i=l; i<=r; i++

)return tot;

}void

fujibayashi_ryou()

int num=belong[n]

;sort

(b+1

,b+1

+n);

maxn=

unique

(b+1

,b+1

+n)-

(b+1);

for(re i=

1; i<=n; i++

)for

(re i=

1; i<=q; i++

)sort

(q+1

,q+1

+q,comp)

;int now=0;

for(re i=

1; i<=num; i++

)while

(r.r)add

(a[++r]);

ll pre=ans;

while

(l>q[j]

.l)add

(a[--l]);

out[q[j]

.id]

=ans;

while

(l<=blockr)

del(a[l++])

; ans=pre;

now=j;}}

for(re i=

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

}int

main()

bzoj4241 歷史研究 回滾莫隊

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

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...

練習 BZOJ4241 歷史研究(回滾莫隊)

給定乙個長度為 n n 的序列,並提出 q role presentation q q個詢問,每次詢問要求回答區間 l r l,r 內所有的權值與其出現次數的積的最大值。我一看,區間問題,無修改可以離線,上莫隊妥妥的,但是仔細一想,當區間擴充時,可以o 1 o 1 的求出新區間答案,但是當區間縮小時...