MnZn被卡常,求助
查看原帖
MnZn被卡常,求助
1069533
sto_clx_orz楼主2024/11/3 22:37

记录

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

int cre,n,m,a[100001],b[1001][1001],tb[1001],tc[100001],Block[100001],c[501][100001],B=400,V=1e5,which[501][100001],which_[501][100001],vec[1001],h;

int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=V;++i)
        Block[i]=((i-1)/B)+1;
    for(int i=1;i<=n;++i)
        cin>>a[i],
        ++b[Block[i]][Block[a[i]]],
        ++c[Block[i]][a[i]];
    for(int i=1;i<=Block[n];++i)
    {
        for(int j=1;j<=Block[V];++j)
            b[i][j]+=b[i-1][j];
        for(int j=1;j<=V;++j)
            c[i][j]+=c[i-1][j],which[i][j]=which_[i][j]=j;
    }
    while(m--)
    {
        int op,l,r,x,y;
        cin>>op>>l>>r;
        int la=Block[l],ra=Block[r];
        if(op==1)
        {
            cin>>x>>y;
            if(x==y)continue;
            h=0;
            for(int i=ra*B-B+1;i<=min(ra*B,n);++i)
                vec[++h]=a[i],a[i]=which[ra][a[i]],which_[ra][a[i]]=a[i];
            for(int i=1;i<=h;++i)which[ra][vec[i]]=vec[i];
            if(la==ra)
            {
                int cnt=0;
                for(int i=l;i<=r;++i)
                    if(a[i]==x)++cnt,a[i]=y;
                for(int i=la;i<=Block[n];++i)
                    b[i][Block[x]]-=cnt,b[i][Block[y]]+=cnt,c[i][x]-=cnt,c[i][y]+=cnt;
                continue;
            }
            h=0;
            for(int i=la*B-B+1;i<=la*B;++i)
                vec[++h]=a[i],a[i]=which[la][a[i]],which_[la][a[i]]=a[i];
            for(int i=1;i<=h;++i)which[la][vec[i]]=vec[i];
            int cnt=0;
            for(int i=l;i<=la*B;++i)
                if(a[i]==x)++cnt,a[i]=y;
            int las=c[la][x],las_=c[la][y];
            b[la][Block[x]]-=cnt,b[la][Block[y]]+=cnt,c[la][x]-=cnt,c[la][y]+=cnt;
            for(int i=la+1;i<ra;++i)
            {
                if(c[i][x]==las)
                {
                    cnt+=c[i][x]-las;
                    las=c[i][x];
                    las_=c[i][y];
                    b[i][Block[x]]-=cnt;
                    c[i][x]-=cnt;
                    b[i][Block[y]]+=cnt;
                    c[i][y]+=cnt;
                    continue;
                }
                if(c[i][y]==las_)
                    which[i][which_[i][x]]=y,which_[i][y]=which_[i][x],which_[i][x]=x;
                else
                {
                    h=0;
                    for(int j=i*B-B+1;j<=i*B;++j)
                        vec[++h]=a[j],a[j]=which[i][a[j]],which_[i][a[j]]=a[j];
                    for(int j=1;j<=h;++j)which[i][vec[j]]=vec[j];
                    for(int j=i*B-B+1;j<=i*B;++j)
                        if(a[j]==x)a[j]=y;
                }
                cnt+=c[i][x]-las;
                las=c[i][x];
                las_=c[i][y];
                b[i][Block[x]]-=cnt;
                c[i][x]-=cnt;
                b[i][Block[y]]+=cnt;
                c[i][y]+=cnt;
            }
            for(int i=ra*B-B+1;i<=r;++i)
                if(a[i]==x)++cnt,a[i]=y;
            for(int i=ra;i<=Block[n];++i)
                b[i][Block[x]]-=cnt,
                c[i][x]-=cnt,
                b[i][Block[y]]+=cnt,
                c[i][y]+=cnt;
        }
        else
        {
            cin>>x;
            h=0;
            for(int i=ra*B-B+1;i<=min(ra*B,n);++i)
                vec[++h]=a[i],a[i]=which[ra][a[i]],which_[ra][a[i]]=a[i];
            for(int i=1;i<=h;++i)which[ra][vec[i]]=vec[i];
            if(la==ra)
            {
                for(int i=l;i<=r;++i)
                    ++tb[Block[a[i]]],++tc[a[i]];
                int cnt=0;
                for(int i=1;i<=Block[V];++i)
                {
                    if(cnt+tb[i]<x)cnt+=tb[i];
                    else
                    {
                        for(int j=i*B-B+1;j<=i*B;++j)
                        {
                            if(cnt+tc[j]<x)cnt+=tc[j];
                            else 
                            {
                                cout<<j<<"\n";
                                break;
                            }
                        }
                        break;
                    }
                }
                for(int i=l;i<=r;++i)
                    tb[Block[a[i]]]=tc[a[i]]=0;
                continue;
            }
            h=0;
            for(int i=la*B-B+1;i<=la*B;++i)
                vec[++h]=a[i],a[i]=which[la][a[i]],which_[la][a[i]]=a[i];
            for(int i=1;i<=h;++i)which[la][vec[i]]=vec[i];
            for(int i=l;i<=la*B;++i)
                ++tb[Block[a[i]]],++tc[a[i]];
            for(int i=ra*B-B+1;i<=r;++i)
                ++tb[Block[a[i]]],++tc[a[i]];
            int cnt=0;
            for(int i=1;i<=Block[V];++i)
            {
                if(cnt+b[ra-1][i]-b[la][i]+tb[i]<x)cnt+=b[ra-1][i]-b[la][i]+tb[i];
                else
                {
                    for(int j=i*B-B+1;j<=i*B;++j)
                    {
                        if(cnt+c[ra-1][j]-c[la][j]+tc[j]<x)cnt+=c[ra-1][j]-c[la][j]+tc[j];
                        else 
                        {
                            cout<<j<<"\n";
                            break;
                        }
                    }
                    break;
                }
            }
            for(int i=l;i<=la*B;++i)
                tb[Block[a[i]]]=tc[a[i]]=0;
            for(int i=ra*B-B+1;i<=r;++i)
                tb[Block[a[i]]]=tc[a[i]]=0;
        }
    }
}
2024/11/3 22:37
加载中...