• LUOGU P1903 [国家集训队]数颜色 / 维护队列


    传送门

    解题思路

    带修莫队,第一次写,其实和普通莫队差不多,就是多了个时间轴,块分n^(2/3)最优,时间复杂度O(n^(5/3))。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    
    using namespace std;
    const int MAXN = 50005;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    
    struct Data{
        int id,l,r,t;
    }q[MAXN];
    
    struct Upd{
        int pos,val;
    }c[MAXN];
    
    int n,m,bl[MAXN],siz,ans[MAXN],a[MAXN];
    int Qcnt,Ccnt,cnt[1000005];
    
    inline bool cmp(Data A,Data B){
        if(bl[A.l]!=bl[B.l]) return bl[A.l]<bl[B.l];
        if(bl[A.r]!=bl[B.r]) return bl[A.r]<bl[B.r];
        return A.t<B.t;
    }
    
    int main(){
        n=rd(),m=rd();int x,y;char s;siz=pow(n,(double)2/3);
        for(int i=1;i<=n;i++) a[i]=rd(),bl[i]=i/siz+1;
        for(int i=1;i<=m;i++){
            cin>>s;x=rd(),y=rd();
            if(s=='Q') 
                q[++Qcnt].l=x,q[Qcnt].r=y,q[Qcnt].id=Qcnt,q[Qcnt].t=Ccnt;
            else 
                c[++Ccnt].pos=x,c[Ccnt].val=y;
        }
        sort(q+1,q+1+Qcnt,cmp);
        int L=1,R=0,now=0,Ans=0;
        for(int i=1;i<=Qcnt;i++){
            while(L<q[i].l) {if(!(--cnt[a[L]])) Ans--;L++;}
            while(L>q[i].l) {L--;if(++cnt[a[L]]==1) Ans++;}
            while(R<q[i].r) {R++;if(++cnt[a[R]]==1) Ans++;}
            while(R>q[i].r) {if(!(--cnt[a[R]])) Ans--;R--;}
            while(now<q[i].t) {
    //            cout<<q[i].t<<endl;
                now++;
                if(q[i].l<=c[now].pos && c[now].pos<=q[i].r){
                    if(!(--cnt[a[c[now].pos]])) Ans--;
                    if(++cnt[c[now].val]==1)  Ans++; 
                }
                swap(c[now].val,a[c[now].pos]);
            }
            while(now>q[i].t) {
                if(q[i].l<=c[now].pos && c[now].pos<=q[i].r) {
                    if(!(--cnt[a[c[now].pos]])) Ans--;
                    if(++cnt[c[now].val]==1)  Ans++; 
                 }
                 swap(c[now].val,a[c[now].pos]);
                 now--;
            }
            ans[q[i].id]=Ans;
        }
        for(int i=1;i<=Qcnt;i++) printf("%d
    ",ans[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    Vim配置
    9.24CSPS模拟10
    10.3CSPS模拟16
    9.26CSPS模拟12
    我被机惨了
    9.25模拟赛
    多层项目中使用EFCore
    EFCore 执行原生SQL语句
    批处理 压缩日志,删除历史文件
    EF的全局过滤器 HasQueryFilter 从EFCore 2.0才有
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9687098.html
Copyright © 2020-2023  润新知