40pts,求调错
查看原帖
40pts,求调错
383791
Others楼主2021/7/18 22:41

看了几天,硬是没看出哪里有毛病,就过了后三个点....

#include <bits/stdc++.h>
using namespace std;
inline void qr(register int &ret){register int x=0,f=0;register char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();ret=f?-x:x;}
struct node{
    int l,r,id,lb,rb,ti;
}p[143338];
bool cmp(node x,node y){
    return x.lb==y.lb?(x.rb==y.rb?x.ti<y.ti:x.rb<y.rb):x.l<y.l;
} 
char Q;
int n,m,s,l,r,tim,tot,a[143338],aa[143338],cnt[1000005],cha[143338][3],c1,c2,ans[143338];
void add(int x){if(++cnt[x]==1) ++tot;}
void del(int x){if(--cnt[x]==0) --tot;}
int main() {
    qr(n),qr(m);
    s=pow(n,2.0/3);
    for(int i=1;i<=n;++i){
        qr(a[i]);
        aa[i]=a[i];
    }
    int o,u;
    for(int i=1;i<=m;++i){
        cin >> Q;qr(o),qr(u);
        if(Q=='Q') p[++c1]=(node){o,u,c1,(o+s-1)/s,(u+1-1)/s,c2};
        else cha[++c2][0]=o,cha[c2][1]=aa[o],cha[c2][2]=aa[o]=u;
    }
    sort(p+1,p+c1+1,cmp);
    l=1,r=tim=0;
    for(int i=1;i<=c1;++i){
        while(tim<p[i].ti){
        	++tim;
            if(cha[tim][0]>=l&&cha[tim][0]<=r) add(cha[tim][2]),del(cha[tim][1]);
            a[cha[tim][0]]=a[cha[tim][2]]; 
        }
        while(tim>p[i].ti){
            if(cha[tim][0]>=l&&cha[tim][0]<=r) add(cha[tim][1]),del(cha[tim][2]);
            a[cha[tim][0]]=a[cha[tim][1]];
            --tim;
        }
        while(l>p[i].l) add(a[--l]);
        while(r<p[i].r) add(a[++r]);
        while(l<p[i].l) del(a[l++]);
        while(r>p[i].r) del(a[r--]);
        ans[p[i].id]=tot;
    }
    for(int i=1;i<=c1;++i){
        printf("%d\n",ans[i]);
    }
    return 0;
}
2021/7/18 22:41
加载中...