求助带修莫队 WA #2
查看原帖
求助带修莫队 WA #2
538609
Neutralized楼主2022/6/17 17:29

套了个值域分块(),感觉没有写锅,但是事实上写锅了。
求调

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

#define ri register int
#define ll long long

//#define Neutral Shimokitazawa //rush!

#define Tp template<class T>
#ifdef Neutral
    const int End=1e6;
    char buf[End],*p1=buf,*p2=buf;
    #define g() (p1==p2&&(p2=(p1=buf)+fread(buf,1,End,stdin),p1==p2)?EOF:*p1++)
#else
    #define g() getchar()
#endif
#define pc(x) putchar(x)
#define isd(x) (x>=48&&x<=57)
namespace SlowIO{
    Tp inline void rd(T &x) {
        x=0; char i=g(); bool f=1;
        while(!isd(i)) f&=(i!='-'),i=g();
        while(isd(i)) x=(x<<3)+(x<<1)+(i^48),i=g();
        x*=((f<<1)-1);
    }
    const int OUT=1e6;
    static char outp[OUT]; int out;
    Tp inline void op(T x){
        out=0; x<0&&(x=-x,pc('-'));
        if(!x){ pc(48); return; }
        while(x) outp[++out]=x%10+48,x/=10;
        while(out) pc(outp[out--]);
    }
    Tp inline void writeln(T x){ op(x);pc('\n'); }
    Tp inline void writesp(T x){ op(x); pc(' '); }
    Tp inline void write(T x,char c=0){ op(x); c&&pc(c); }
}; using namespace SlowIO;

#define N 100003
#define lbw lower_bound
//lenb = n^{\frac{k-1}{k}}
int a[N],b[N<<1],lenq,belq[N];
int lenv,belv[N<<1],L[651],R[651];
int siz[651],cnt[N<<1],tag[N];
struct qry{
    int l,r,t,id;
    inline bool operator <(const qry &a) const{
        if(belq[l]^belq[a.l]) return belq[l]<belq[a.l];
        if(belq[t]^belq[a.t]) return belq[t]<belq[a.t];
        return ((belq[l]+belq[t])&1)?r<a.r:r>a.r;
    }
}qr[N];
struct chg{
    int pos,val;
}ch[N]; int ans[N];
inline void get_block(int n){
    lenq=pow(n,2.0/3.0),lenv=sqrt(n); L[1]=1;
    for(ri i=1;i<=n;++i){
        belv[i]=(i-1)/lenv+1,belq[i]=(i-1)/lenq+1;
        if(belv[i]^belv[i-1]) L[belv[i]]=i,R[belv[i]-1]=i-1;
    } R[belv[n]]=n;
}
inline void Add(int x){
    if(tag[cnt[a[x]]]==1) --siz[belv[cnt[a[x]]]];
    --tag[cnt[a[x]]],++cnt[a[x]],++tag[cnt[a[x]]];
    if(tag[cnt[a[x]]]==1) ++siz[belv[cnt[a[x]]]];
}
inline void Del(int x){
    if(tag[cnt[a[x]]]==1) --siz[belv[cnt[a[x]]]];
    --tag[cnt[a[x]]],--cnt[a[x]],++tag[cnt[a[x]]];
    if(tag[cnt[a[x]]]==1) ++siz[belv[cnt[a[x]]]];
}
inline void Chg(int id,int l,int r){
    ri x=ch[id].pos,&v=ch[id].val;
    if(x>=l&&x<=r){ //如果不在区间里就没有贡献!!!1
        Del(x);
        if(tag[cnt[v]]==1) --siz[belv[cnt[v]]];
        --tag[cnt[v]],++cnt[v],++tag[cnt[v]];
        if(tag[cnt[v]]==1) ++siz[belv[cnt[v]]];
    } swap(v,a[x]);
} int n,m;
inline int Mex(){
    ri idx=1; while(siz[idx]==lenv) ++idx;
    if(!L[idx]) return R[idx-1]+1;
    for(ri i=L[idx];i<=R[idx];++i)
        if(!tag[i]) return i;
}

int main()
{
    rd(n),rd(m);
    for(ri i=1;i<=n;++i) rd(a[i]),b[i]=a[i];
    int tot=n,cnt_q=0,cnt_c=0,len;
    for(ri i=1;i<=m;++i){
        int cho,l,r; rd(cho),rd(l),rd(r);
        if(cho&1) ++cnt_q,qr[cnt_q]={l,r,cnt_c,cnt_q};
        else ++cnt_c,ch[cnt_c]={l,b[++tot]=r};
    } sort(b+1,b+tot+1),len=unique(b+1,b+tot+1)-b-1;
    for(ri i=1;i<=n;++i) a[i]=lbw(b+1,b+len+1,a[i])-b;
    for(ri i=1;i<=cnt_c;++i) ch[i].val=lbw(b+1,b+len+1,ch[i].val)-b;
    get_block(n),sort(qr+1,qr+cnt_q+1);
    ri cl=1,cr=0,ct=0,lef,rig,mdf;
    for(ri i=1;i<=cnt_q;++i){
        lef=qr[i].l,rig=qr[i].r,mdf=qr[i].t;
        while(cl>lef) Add(--cl);
        while(cr<rig) Add(++cr);
        while(ct<mdf) Chg(++ct,lef,rig);
        while(cl<lef) Del(cl++);
        while(cr>rig) Del(cr--);
        while(ct>mdf) Chg(ct--,lef,rig);
        ans[qr[i].id]=Mex();
    } for(ri i=1;i<=cnt_q;++i) writeln(ans[i]);
    return 0;
}
2022/6/17 17:29
加载中...