faebdcは、Moのチームをトラブル
考え
Moのチームを考えるのは難しいビット。
まず、我々は確かになりcnt[i]
にくい、レコードi
の発生数が、我々は数が現在の最大数であることを起こる場合は難易度の各削除後、その難しさ、私たちはあなたの答えを更新したいことがあり、ことを発見し、どのくらいの難易度に応じて、数は、現在の最大数であることを起こるので、我々は開く必要がありますsum[i]
どのくらいのより困難であるレコードの数をi
。
MOフリート更新ルールを得ることは容易で上記の分析後:
inline void add(int x){
--sum[cnt[a[x]]];
++cnt[a[x]];
++sum[cnt[a[x]]];
ans=max(cnt[a[x]], ans);
}
inline void del(int x){
--sum[cnt[a[x]]];
if(cnt[a[x]]==ans&&sum[cnt[a[x]]]==0) --ans;
--cnt[a[x]];
++sum[cnt[a[x]]];
}
またの範囲ので注意してください( - 10 ^ 5 \ルA [i]が\ル10 ^ 5 \)\、私たちは、すべての数値に追加することができます\(10 ^ 5 \)
サンプルコード
#include <cstdio>
#include <algorithm>
#include <cmath>
#define MAXN 100010
#define MAXQ 200010
using namespace std;
int ans,cnt[100001*2],sum[100001];
int a[MAXN];
inline void add(int x){
--sum[cnt[a[x]]];
++cnt[a[x]];
++sum[cnt[a[x]]];
ans=max(cnt[a[x]], ans);
}
inline void del(int x){
--sum[cnt[a[x]]];
if(cnt[a[x]]==ans&&sum[cnt[a[x]]]==0) --ans;
--cnt[a[x]];
++sum[cnt[a[x]]];
}
struct nod{
int l,r,bid,qid;
} q[MAXQ];
bool cmp(const nod &a, const nod &b){
return (a.bid^b.bid?(a.l<b.l):((a.bid&1)?(a.r<b.r):(a.r>b.r)));
}
int n,m,blo,res[MAXQ];
int main()
{
scanf("%d %d", &n, &m);
blo=n/sqrt(m*2/3);
for(int i=1;i<=n;++i) scanf("%d", &a[i]),a[i]+=100000;
for(int i=1;i<=m;++i){
scanf("%d %d", &q[i].l, &q[i].r);
q[i].bid=q[i].l/blo;
q[i].qid=i;
}
sort(q+1, q+1+m, cmp);
int l=1,r=1;cnt[a[1]]=1;sum[1]=1;ans=1;
for(int i=1;i<=m;++i){
while(l<q[i].l) del(l++);
while(l>q[i].l) add(--l);
while(r>q[i].r) del(r--);
while(r<q[i].r) add(++r);
res[q[i].qid]=ans;
}
for(int i=1;i<=m;++i) printf("%d\n", res[i]);
return 0;
}