ACWING 2521. 数颜色

ACWING 2521. 数颜色

原题链接

描述

墨墨购买了一套 NN 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。

墨墨会像你发布如下指令:

  1. Q L R 代表询问你从第 L 支画笔到第 R 支画笔中共有几种不同颜色的画笔。
  2. R P Col 把第 PP 支画笔替换为颜色 Col。

为了满足墨墨的要求,你知道你需要干什么了吗?

思路

带修莫队模板

代码

#include <bits/stdc++.h>
using namespace std;
const int N=10010,S=1000010;
int n,m,mq,mc,len;
int w[N],cnt[S],ans[N];
struct Query{
    int id,l,r,t;
}q[N];
struct Modify{
    int p,c;
}c[N];
int get(int x){
    return x/len;
}
bool cmp(const Query &a,const Query &b){
    int al=get(a.l),ar=get(a.r);
    int bl=get(b.l),br=get(b.r);
    if(al!=bl) return al<bl;
    if(ar!=br) return ar<br;
    return a.t<b.t;
}
void add(int x,int &res){
    if(!cnt[x]) res++;
    cnt[x]++;
}
void del(int x,int &res){
    cnt[x]--;
    if(!cnt[x]) res--;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",w+i);
    for(int i=0;i<m;i++){
        char op[2];
        int a,b;
        scanf("%s%d%d",op,&a,&b);
        if(*op=='Q') mq++,q[mq]={mq,a,b,mc};
        else c[++mc]={a,b};

    }
    len=cbrt((double)n*mc)+1;
    sort(q+1,q+mq+1,cmp);
    for(int i=0,j=1,t=0,k=1,res=0;k<=mq;k++){
        int id=q[k].id,l=q[k].l,r=q[k].r,tm=q[k].t;
        while(i<r) add(w[++i],res);
        while(i>r) del(w[i--],res);
        while(j<l) del(w[j++],res);
        while(j>l) add(w[--j],res);
        while(t<tm){
            t++;
            if(c[t].p>=j&&c[t].p<=i){
                del(w[c[t].p],res);
                add(c[t].c,res);
            }
            swap(w[c[t].p],c[t].c);
            
        }
        while(t>tm){
            
            if(c[t].p>=j&&c[t].p<=i){
                del(w[c[t].p],res);
                add(c[t].c,res);
            }
            swap(w[c[t].p],c[t].c);
            t--;
        }
        ans[id]=res;
    }
    for(int i=1;i<=mq;i++) printf("%d\n",ans[i]);
    return 0;
}
posted @ 2021-02-03 15:23  ans20xx  阅读(55)  评论(0编辑  收藏  举报