CodeForces - 935A Fafa and his Company [带修改莫队]

题意:给你n个数,m个询问 询问[L,R]的Mex,与修改一个位置的数。

题解:带修改莫队裸题,需要注意的是莫队l,r移动的时候先考虑范围加,再考虑范围减,不然会RE。

AC代码:

#include
#include
#include
using namespace std;
const int MAXN=(int)(2e5+10);
int N,M,Qnum,Cnum,tot;
int a[MAXN],b[MAXN],c[MAXN],where[MAXN];
struct Query
{
    int x,y,time,id;
}Q[MAXN];
struct Change
{
    int pos,pre,val;
}C[MAXN];
int num[MAXN],ans[MAXN],len,cntnum[MAXN/2];
int comp(const Query &a,const Query &b)
{
    if(where[a.x]!=where[b.x]) return a.x=Q[i].x&&C[now].pos<=Q[i].y)//注意:只有修改在查询的区间内才会对查询的结果产生影响 
    {
    	Delet(C[now].pre);
    	Add(C[now].val);
    }
    a[C[now].pos]=C[now].val;
}
void mDel(int now,int i)
{
    if(C[now].pos>=Q[i].x&&C[now].pos<=Q[i].y)//注意:只有修改在查询的区间内才会对查询的结果产生影响 
    {
    	Delet(C[now].val);
    	Add(C[now].pre);
    }
    a[C[now].pos]=C[now].pre;
}
void MoQueue()
{
    int l=1,r=0,now=0; 
    for(int i=1;i<=Qnum;i++)
    {
        int nowans=1;
        while(l>Q[i].x) Add(a[--l]);
        while(rQ[i].y) Delet(a[r--]);//以上四句为莫队模板 
        while(nowQ[i].time) mDel(now--,i);//改多了,改回来 
		while(cntnum[nowans]>0)nowans++;
        ans[Q[i].id]=nowans;//统计答案 
    }
    for(int i=1;i<=Qnum;i++)
        printf("%d\n",ans[i]);
}
int main()
{
	scanf("%d%d",&N,&M);
    len=max((int)pow(N,2*1.0/3),1);
    for(int i=1;i<=N;i++) scanf("%d",&a[i]),where[i]=(i-1)/len+1,c[i]=b[tot++]=a[i];
    while(M--)
    {
        int opt;
        scanf("%d",&opt);
        if(opt==1)
        {
        	Qnum++;
        	scanf("%d%d",&Q[Qnum].x,&Q[Qnum].y);
            Q[Qnum].time=Cnum;//别忘了记录最近的修改位置 
            Q[Qnum].id=Qnum;        
        }
        else
        {
        	Cnum++;
        	scanf("%d%d",&C[Cnum].pos,&C[Cnum].val);
        	C[Cnum].pre=c[C[Cnum].pos];
        	c[C[Cnum].pos]=C[Cnum].val;
        	b[tot++]=C[Cnum].val;
        }
    }
    sort(b,b+tot);
    tot=unique(b,b+tot)-b;
    for(int i=1;i<=Cnum;i++)
   	{
	   	C[i].pre=lower_bound(b,b+tot,C[i].pre)-b;
	   	C[i].val=lower_bound(b,b+tot,C[i].val)-b;
	}
	for(int i=1;i<=N;i++)
		a[i]=lower_bound(b,b+tot,a[i])-b;
    sort(Q+1,Q+Qnum+1,comp);
    MoQueue();
    return 0;
}


你可能感兴趣的:(Codeforces,莫队算法)