萌新刚学回滚莫队,一半WA,一半T,调一晚上,求大佬
查看原帖
萌新刚学回滚莫队,一半WA,一半T,调一晚上,求大佬
363495
我爱杨帆楼主2020/11/24 22:36
#include<bits/stdc++.h>
#define int long long
#define inf 1e12
const int sz=1e6+5;
const int mod=1e9+7;
using namespace std;
int read() {
	char c=getchar();
	int r=0,f=1;
	while((c<'0'||c>'9')&&c!='-')
		c=getchar();
	if(c=='-') {
		f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		r=r*10+c-'0';
		c=getchar();
	}
	return f*r;
}
int a[sz],len,n,m,num[sz],R[sz],L[sz],cnt[sz],b[sz],Ans[sz],tot,maxb,maxn=0;
struct node
{
	int l,r,pos,id;
}t[sz];
bool cmp(node x,node y)
{
	if(x.l==y.l) return x.r<y.r;
	else return x.l<y.l;
}
bool cmp1(int x,int y)
{
	return x<y;
}
void pre()
{
	sort(num+1,num+1+n,cmp1);sort(t+1,t+1+m,cmp);
    tot=unique(num+1,num+1+n)-num-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(num+1,num+1+tot,a[i])-num;
	maxb=n/len;
	L[1]=1,R[1]=L[1]+len-1;
    for(int i=2;i<=maxb;i++)
    L[i]=R[i-1]+1,R[i]=L[i]+len-1;
    if(R[maxb]<n) R[++maxb]=n,L[maxb]=R[maxb-1]+1;
    for(int i=1;i<=maxb;i++)
    	for(int j=L[i];j<=R[i];j++)   	   b[j]=i;
}
void force(int l,int r,int id)
{
    memset(cnt,0,sizeof(cnt));
	for(int i=l;i<=r;i++)
			cnt[a[i]]++;
 	for(int i=1;i<=tot;i++)
	{
		if(!cnt[i]) {			
		Ans[id]=num[i];
		break;	
		}					
    }
	for(int i=l;i<=r;i++)
    	cnt[a[i]]--;
}
signed main() {
   n=read(),m=read();
   len=sqrt(n);
   for(int i=1;i<=n;i++) a[i]=read(),num[i]=a[i],maxn=max(maxn,num[i]);
   for(int i=1;i<=m;i++) t[i].l=read(),t[i].r=read(),t[i].pos=t[i].l/len+1,t[i].id=i;
   pre();
//   for(int i=1;i<=n;i++) cout<<a[i]<<" ";
//   cout<<endl;
   int now=1;
   for(int i=1;i<=maxb;i++)
   {
    memset(cnt,0,sizeof(cnt));
	int r=R[i],tmp,nowm=-1;
	while(b[t[now].l]==i)
	{   			
//	    if(i==2) cout<<t[now].id<<"giao"<<endl;
		if(b[t[now].l]==b[t[now].r]) 
		{
			force(t[now].l,t[now].r,t[now].id);
			now++;
		    continue;
		}
		else
		{
		    int l=R[i]+1;
			while(r<t[now].r) cnt[a[++r]]++;
			if(cnt[nowm]||nowm==-1) 
		    {
				nowm=-1;
				for(int j=1;j<=tot;j++)
		    	{
				   if(!cnt[j]){   
				 	  nowm=j;
			          break;
				 	}		
     			}	
		    }
			tmp=nowm;		
			while(l>t[now].l)  cnt[a[--l]]++;
			if(cnt[nowm]||nowm==-1)
			{   
		        nowm=-1;
				for(int j=1;j<=tot;j++)
                    if(!cnt[j]){
					nowm=j;
                      break;
					}		
            }
			if(nowm==-1) Ans[t[now].id]=maxn+1;		
		    else Ans[t[now].id]=num[nowm];
		    nowm=tmp;
		    while(l<=R[i]) --cnt[a[l++]];
// 		    cout<<nowm<<endl;
			now++;
		 }   		
    }   
   }
  for(int i=1;i<=m;i++) cout<<Ans[i]<<endl;
//  cout<<tot<<"giao"<<endl;
}
/*
5 1
2 1 0 2 1
3 5
*/
2020/11/24 22:36
加载中...