莫队50pts求调教
查看原帖
莫队50pts求调教
754502
_AyachiNene楼主2023/8/8 11:15
#include<bits/stdc++.h>
using namespace std;
struct node
{
    int id,l,r;
}q[114514*2];
int maxn;
int ans[114514*2];
int n,m,a[114514*2];
int size,belong[114514*2],l=1,r,cnt[114514*2],t[114514*2],b[114514];
bool cmp(node x,node y)
{
    if(belong[x.l]==belong[y.l])
        return x.r<y.r;
    return belong[x.l]<belong[y.l];
}
void add(int x)
{
    t[cnt[a[x]]]--;
    t[++cnt[a[x]]]++;
    maxn=max(maxn,cnt[a[x]]);
}
void del(int x)
{
    t[cnt[a[x]]]--;
    if(maxn==cnt[a[x]]&&!t[cnt[a[x]]])
        maxn--;
    t[--cnt[a[x]]]++;
}
int main()
{
    cin>>n>>m;
    size=sqrt(n);
    for(int i=1;i<=n;i++)
    	cin>>a[i],b[i]=a[i];
    sort(b+1,b+n+1);
	int sum=unique(b+1,b+1+n)-b;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+1+sum,a[i])-b;
    for(int i=1;i<=n;i++)
        belong[i]=i/size+1;
    for(int i=1;i<=m;i++)
        cin>>q[i].l>>q[i].r,q[i].id=i;
    sort(q+1,q+m+1,cmp);
    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)
            add(++r);
        while(r>q[i].r)
            del(r--);
        ans[q[i].id]=maxn;
    }
    for(int i=1;i<=m;i++)
        cout<<-ans[i]<<endl;
}
2023/8/8 11:15
加载中...