萌新求助带修莫队
  • 板块学术版
  • 楼主assert_0
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/16 22:28
  • 上次更新2024/1/17 12:54:44
查看原帖
萌新求助带修莫队
532536
assert_0楼主2024/1/16 22:28

rt,调了一天了,模板题还是40分,问题点好像在修改

#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define int long long
#define N 140000
#define M 1100000
int n,m,a[M],ans[M],cnt[M],len,now;
char op[M];
struct node{
    int l,r,id,a,x,uid;
}v[M];
int area(int x){
    return x/len;
}
int cmp(node x,node y){
    if(area(x.l)!=area(y.l)){
        return area(x.l)<area(y.l);
    }
    return x.r<y.r;
}
void add(int x){
    if(cnt[x]==0){
        now++;
    }
    cnt[x]++;
    return ;
}
void del(int x){
    if(cnt[x]==1){
        now--;
    }
    cnt[x]--;
    return ;
}
signed main(){
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    len=pow(n,0.6666);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>op[i];
        if(op[i]=='Q'){
            cin>>v[i].l>>v[i].r;
        }
        else{
            cin>>v[i].a>>v[i].x;
            v[i].l=-1;
        }
        v[i].id=v[i-1].id;
        if(v[i].l==-1){
            v[i].id++;
        }
        v[i].uid=i;
    }
    sort(v+1,v+m+1,cmp);
    int l=1,r=0,maxx=0,pre=0;
    for(int i=1;i<=m;i++){
        if(v[i].l==-1){
            maxx=i;
            continue;
        }
        while(r<v[i].r){
            r++;
            add(a[r]);
        }
        while(l>v[i].l){
            l--;
            add(a[l]);
        }
        while(r>v[i].r){
            del(a[r]);
            r--;
        }
        while(l<v[i].l){
            del(a[l]);
            l++;
        }
        while(pre<v[i].id){
            pre++;
            if(l<=v[pre].a&&v[pre].a<=r){
                del(a[v[pre].a]);
                add(v[pre].x);
            }
            swap(a[v[pre].a],v[pre].x);
        }
        while(pre>v[i].id){
            if(l<=v[pre].a&&v[pre].a<=r){
                del(a[v[pre].a]);
                add(v[pre].x);
            }
            swap(a[v[pre].a],v[pre].x);
            pre--;
        }
        ans[v[i].uid]=now;
    }
    for(int i=1;i<=m;i++){
        if(op[i]=='R'){
            continue;
        }
        cout<<ans[i]<<endl;
    }
    return 0;
}
2024/1/16 22:28
加载中...