萌新求调莫队 WA#3
查看原帖
萌新求调莫队 WA#3
453557
NKPHIN楼主2021/8/26 20:37

调了一天了QAQ
对着题解看感觉是哪里越界了
但是改了就变成 WA #2了,求大佬查错
WA#2 WA#3

//program 0_1.cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+4;
int numq,numf,n,m;
int A[maxn],bel[maxn],ans[maxn],cnt[maxn],num[maxn];//cnt次数,num次数的次数
int Map[maxn<<1],K[maxn<<1],C[maxn<<1];  //map记录离散化
struct section{
    int l,r;
    int times;
    int index;
} S[maxn];
struct Modify{
    int pos;
    int number;
    int value;      //离散后的值
} M[maxn];
inline int read()
{
    char ch=getchar();
    int x=0,f=1;
    while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
bool cmp(section a,section b)
{
    if(bel[a.l]^bel[b.l]) return bel[a.l]<bel[b.l];
    if(bel[a.r]^bel[b.r]) return bel[a.r]<bel[b.r];
    return a.times<b.times;
}
void add(int pos)
{
    num[cnt[Map[pos]]]--;
    num[++cnt[Map[pos]]]++;
}
void del(int pos)
{
    num[cnt[Map[pos]]]--;
    num[--cnt[Map[pos]]]++;  //这里加上 if(cnt[Map[pos]]==0) break;就WA #2了
}
void lsh()
{
    for(int i=1;i<=numf+n;i++)
    K[i]=C[i];
    sort(K+1,K+1+numf+n);
    int len=unique(K+1,K+1+n+numf)-K-1;
    for(int i=1;i<=n;i++)
    Map[i]=lower_bound(K+1,K+1+len,C[i])-K;
    for(int i=1;i<=numf;i++)
    M[i].value=lower_bound(K+1,K+1+len,C[i+n])-K;
}
void swap(int& a,int& b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}
int main()
{
    n=read(),m=read();
    num[0]=2147483647;
    for(int i=1;i<=n;i++)
    C[i]=A[i]=read();          //A记录原数组,C记录原数组与修改值
    numq=0,numf=0;
    for(int i=1;i<=m;i++)
    {
        int opt=read();
        if(opt==1)
        {
            S[++numq].l=read();
            S[numq].r=read();
            S[numq].index=numq;
            S[numq].times=numf;
        }
        if(opt==2)
        {
            M[++numf].pos=read();
            C[numf+n]=M[numf].number=read();  //C记录修改
        }
    }
    lsh();    //离散化
    int size=pow(n,2.0/3.0);
    for(int i=1;i<=n;i++)
    bel[i]=(i-1)/size+1;      //belong
    sort(S+1,S+1+numq,cmp);    //S数组记录查询  
    int L=1,R=0,T=0;
    for(int i=1;i<=numq;i++)
    {
        int ql=S[i].l;
        int qr=S[i].r;
        int qt=S[i].times;
        while(L<ql) del(L++);
        while(L>ql) add(--L);
        while(R<qr) add(++R);
        while(R>qr) del(R--);
        while(T<qt)
        {
            T++;
            if(M[T].pos>=ql&&M[T].pos<=qr)
            {
                del(M[T].pos);
                num[cnt[M[T].value]]--;       //add
                num[++cnt[M[T].value]]++;
            }
            //swap(M[T].number,A[M[T].pos]);
            swap(M[T].value,Map[M[T].pos]);
        }
        while(T>qt)
        {
            if(M[T].pos>=ql&&M[T].pos<=qr)
            {
                del(M[T].pos);
                num[cnt[M[T].value]]--;       //add
                num[++cnt[M[T].value]]++;
            }
            //swap(M[T].number,A[M[T].pos]);
            swap(M[T].value,Map[M[T].pos]);
            T--;
        }
        for(int j=1;j<maxn;j++)
        if(!num[j]) {ans[S[i].index]=j;break;}
    }
    for(int i=1;i<=numq;i++)
    printf("%d\n",ans[i]);
    return 0;
}
2021/8/26 20:37
加载中...