代码46分,求各位大佬调一下
查看原帖
代码46分,求各位大佬调一下
784710
wangjiayue楼主2024/12/3 18:20
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e6+5;
struct node{
	ll l,r,id;
}e[N];
ll n,m,k,a[N],tr[N],ans[N],mp[N],mpl[N],B[N],maxx,cnt=1,qu,nxtl=1,nxtr;
bool cmp(node x,node y){
	if(x.l/qu==y.l/qu) return x.r<y.r;
	return x.l/qu<y.l/qu;
}
void add(ll x){
	mp[a[x]]++;
	if(mp[a[x]]==1) mpl[B[a[x]]]++;
}
void del(ll x){
	mp[a[x]]--;
	if(mp[a[x]]==0) mpl[B[a[x]]]--;	
}
void getans(ll id){
	for(int i=0;i<=B[maxx];i++) {
		if(mpl[i]<qu){
			for(int j=qu*i;j<=(i+1)*qu-1;j++){
				if(!mp[j]){
					ans[id]=j;
					return ;
				}
			}
		}		
	}
}
int main(){
//	freopen("P4137_2 (1).in","r",stdin);
//	freopen("mex","w",stdout);
	scanf("%lld%lld",&n,&m);
	qu=sqrt(n);
	for(int i=1;i<=n;i++) {
		scanf("%lld",&a[i]);
		maxx=max(maxx,a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&e[i].l,&e[i].r);
		e[i].id=i;
	}
	sort(e+1,e+1+m,cmp);
	qu=sqrt(maxx);
	memset(ans,-1,sizeof(ans));
	for(int i=0;i<=n;i++) B[i]=i/qu;
	for(int i=1;i<=m;i++){
		while(nxtl>e[i].l) add(--nxtl);
		while(nxtr<e[i].r) add(++nxtr);
		while(nxtl<e[i].l) del(nxtl++);
		while(nxtr>e[i].r) del(nxtr--);
		getans(e[i].id);
		if(ans[e[i].id]==-1) ans[e[i].id]=maxx+1;
	}
	for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
	return 0;
}
2024/12/3 18:20
加载中...