10 pts 求助
查看原帖
10 pts 求助
374433
ppip喵喵喵楼主2021/8/11 12:15
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN=5e6+5;
// #define int long long
int a[MAXN],cnt[MAXN];
int bl[MAXN];
int t[MAXN];
struct Q
{
    int l;
    int r;
    int id;
} q[MAXN];
bool cmp(Q a,Q b)
{
    return bl[a.l]^bl[b.l]?bl[a.l]<bl[b.l]:bl[a.l]&1?a.r<b.r:a.r>b.r;
}
int ans[MAXN];
void add(int p);
void del(int p);
int now;
int d[MAXN];
signed main()
{
    int n,m;
    cin>>n>>m;
    int bls=sqrt(n);
    for (int i=1;i<=n;++i)
        scanf("%d",d+i),a[i]=d[i],bl[i]=(i-1)/bls+1;
    int size=unique(d+1,d+n+1)-d-1;
	for(int i=1;i<=n;++i)
		a[i]=lower_bound(d+1,d+size+1,a[i])-d;
    for (int i=1;i<=m;++i)
    {
        scanf("%d %d",&q[i].l,&q[i].r);
        q[i].id=i;
    }
    sort(q+1,q+m+1,cmp);
    int l=1,r=0;
    for (int i=1;i<=m;++i)
    {
        int ql=q[i].l,qr=q[i].r;
        while (r<qr) add(++r);
        while (r>qr) del(r--);
        while (l<ql) del(l++);
        while (l>ql) add(--l);
        ans[q[i].id]=now;
    }
    for (int i=1;i<=m;++i)
        printf("-%d\n",ans[i]);
    return 0;
}
void add(int i)
{
    t[cnt[a[i]]]--;
	t[++cnt[a[i]]]++;
	now=max(now,cnt[a[i]]);
}
void del(int i)
{
    t[cnt[a[i]]]--;
	if(cnt[a[i]]==now&&!t[cnt[a[i]]])now--;
	t[--cnt[a[i]]]++;
}

P1997 faebdc 的烦恼 AC\texttt{AC}

2021/8/11 12:15
加载中...