如果分塊的話與區間眾數沒有本質區別。這裡考慮莫隊。
顯然莫隊時的刪除可以用堆維護,但多了乙個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...