BZOJ4241 歷史研究(莫隊)

2022-05-20 16:12:59 字數 1096 閱讀 4676

如果分塊的話與區間眾數沒有本質區別。這裡考慮莫隊。

顯然莫隊時的刪除可以用堆維護,但多了乙個log不太跑得過。

有一種叫回滾莫隊的trick,可以將問題變為只有加入操作。按莫隊時分的塊依次處理,一塊中左端點的差不超過√n,右端點單調遞增。首先將右端點也在該塊中的詢問暴力處理。然後令指標l在下一塊開頭,指標r在這一塊結尾。暴力擴充套件右端點移動指標r,到達詢問點時,移動指標l以回答詢問,但不讓指標l的移動對之後的詢問產生影響,即回滾。這樣就可以處理刪除了。

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 100010

#define ll long long

intn,m,a[n],b[n],cnt[n];

ll ans[n];

struct

data

}q[n];

intmain()

for (int j=q[i].x;j<=q[i].y;j++) cnt[a[j]]--;

i++;

}int r=(q[i].k+1)*block-1;ll v=0

;

for (int j=i;j<=t;j++)

ans[q[j].i]=v;

for (int k=(q[i].k+1)*block-1;k>=q[j].x;k--)

for (int k=(q[i].k+1)*block-1;k>=q[j].x;k--) cnt[a[k]]--;

}memset(cnt,

0,sizeof

(cnt));

i=t;

}for (int i=1;i<=m;i++) printf(ll,ans[i]);

return0;

}

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