莫队 RE 求助
查看原帖
莫队 RE 求助
945364
LiJoQiao楼主2024/1/20 12:13

本地可过样例。

#include<bits/stdc++.h>
using namespace std;
constexpr int MAXN=133333+10,MAXM=133333+10;
int n,m,a[MAXN],tmp[MAXN],cntc,cntq,ans[MAXM],T,l,r,cnt[MAXN],tans,chn;
struct change{
    int p,l,c;
}c[MAXM];
struct query{
    int id,l,r,c;
}q[MAXM];
template<typename T>
T read(){
    T f=1,x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
    return f*x;
}
namespace sol{
    bool cmp(query x,query y){
        int lx=(x.l-1)/T,ly=(y.l-1)/T;
        if(lx!=ly)return lx<ly;
        else{
            int rx=(x.r-1)/T,ry=(y.r-1)/T;
            if(rx!=ry){
                if(lx&1)return rx>ry;
                else return rx<ry;
            }else{
                int cx=(x.c-1)/T,cy=(y.c-1)/T;
                if(rx&1)return cx>cy;
                else return cx<cy;
            }
        }
    }
    void add(int p){
        ++cnt[a[p]];
        if(cnt[a[p]]==1)++tans;
    }
    void del(int p){
        --cnt[a[p]];
        if(cnt[a[p]]==0)--tans;
    }
    void chg(int p,int x){
        if(l<=p&&p<=r)del(p);
        a[p]=x;
        if(l<=p&&p<=r)add(p);
    }
    void solve(){
        n=read<int>();m=read<int>();
        for(int i=1;i<=n;++i){
            tmp[i]=a[i]=read<int>();
        }
        while(m--){
            char op[10];
            scanf("%s",op);
            if(op[0]=='Q'){
                int l1=read<int>(),r1=read<int>();
                ++cntq;
                q[cntq]={cntq,l1,r1,cntc};
            }else{
                int p1=read<int>(),c1=read<int>();
                c[++cntc]={p1,tmp[p1],c1};
                tmp[p1]=c1;
            }
        }
        T=pow(n,2.0/3.0);
        sort(q+1,q+cntq+1,cmp);
        l=r=1;add(1);
        for(int i=1;i<=cntq;++i){
            while(l>q[i].l)add(--l);
            while(r<q[i].r)add(++r);
            while(l<q[i].l)del(l++);
            while(r>q[i].r)del(r--);
            while(chn<q[i].c){
                ++chn;
                chg(c[chn].p,c[chn].c);
            }
            while(chn>q[i].c){
                chg(c[chn].p,c[chn].l);
                --chn;
            }
            ans[q[i].id]=tans;
            // printf("q[%d]={%d,%d,%d,%d}\n",i,q[i].id,q[i].l,q[i].r,q[i].c);
        }
        for(int i=1;i<=cntq;++i)printf("%d\n",ans[i]);
    }
}
int main(){
    sol::solve();
    return 0;
}
2024/1/20 12:13
加载中...