悬3关,MnZn刚学莫队40pts求助
查看原帖
悬3关,MnZn刚学莫队40pts求助
1270894
_O_w_O_楼主2024/5/23 22:52

rt

#include<bits/stdc++.h>
using namespace std;

const int N=2e5+5;
int n,q;
int a[N];
int belong[N];
int cnt[N],num,sum[N];
int L,R;
int query[N];
vector<int> v;
struct ask{
	int l,r;
	int id;
	bool operator <(ask &b){
		if(belong[l]==belong[b.l]) return r<b.r;
		return belong[l]<belong[b.l];
	}
}b[N];

void add(int x){
	sum[++cnt[a[x]]]++;
	if(cnt[a[x]]>num) num=cnt[a[x]];
}

void del(int x){
	if(sum[cnt[a[x]]]==1&&num==cnt[a[x]]) num--;
	sum[cnt[a[x]]--]--;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	L=1;
	cin>>n>>q;
	for(int i=1;i<=n;i++) belong[i]=i/sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		v.push_back(a[i]);
	}
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()));
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
	}
	for(int i=1;i<=q;i++){
		cin>>b[i].l>>b[i].r;
		b[i].id=i;
	}
	sort(b+1,b+q+1);
	for(int i=1;i<=q;i++){
		while(L<b[i].l) del(L++);
		while(L>b[i].l) add(--L);
		while(R<b[i].r) add(++R);
		while(R>b[i].r) del(R--); 
		query[b[i].id]=num;
	}
	for(int i=1;i<=q;i++) cout<<-query[i]<<endl;
	return 0;
}
2024/5/23 22:52
加载中...