• luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队


    十分玄学的数据结构~

    code: 

    #include <bits/stdc++.h>
    #define N 1000006 
    #define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)    
    using namespace std; 
    int n,m,ans,B,cnt,tot,now;                                
    int a[N],tim[N],output[N];       
    struct query
    {
        int l,r,t,id;    
        bool operator<(query b) const 
        {
            return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;           
        }   
    }q[N];  
    struct change 
    {
        int p,col;                   
    }c[N];      
    void add(int x) 
    {
        if(tim[x]==0) ++ans;    
        ++tim[x];  
    }   
    void del(int x) 
    {
        if(tim[x]==1) --ans; 
        --tim[x];   
    }
    void work(int x,int d) 
    {       
        // 需要进行变动 
        if(c[d].p>=q[x].l&&c[d].p<=q[x].r) del(a[c[d].p]), add(c[d].col);    
        swap(c[d].col, a[c[d].p]);  
    }
    int main() 
    { 
        // setIO("input");    
        int i,j,l=2,r=1;  
        scanf("%d%d",&n,&m); 
        B=pow(n,0.6666);         
        for(i=1;i<=n;++i) scanf("%d",&a[i]);    
        for(i=1;i<=m;++i) 
        {
            char op[2];  
            scanf("%s",op);  
            if(op[0]=='Q') 
            {     
                ++cnt;          
                scanf("%d%d",&q[cnt].l,&q[cnt].r);    
                q[cnt].id=cnt; 
                q[cnt].t=tot;                 
            } 
            else 
            {   
                ++tot;      
                scanf("%d%d",&c[tot].p,&c[tot].col);    
            }
        }
        sort(q+1,q+1+cnt);    
        for(i=1;i<=cnt;++i) 
        {     
            for(;l>q[i].l;) add(a[--l]);      
            for(;r<q[i].r;) add(a[++r]);   
            for(;l<q[i].l;) del(a[l++]);    
            for(;r>q[i].r;) del(a[r--]);    
            for(;now<q[i].t;) work(i, ++now);      
            for(;now>q[i].t;) work(i, now--);
            output[q[i].id]=ans;   
        }    
        for(i=1;i<=cnt;++i) printf("%d
    ",output[i]);    
        return 0; 
    }
    

      

  • 相关阅读:
    读取STL模型 并用opengl显示
    金币阵列问题
    字典序问题的解决方案
    opengl中的旋转与平移
    copy文件夹,通过C++读取系统、用户名以及计算机名的方法
    poj3032
    菲涅尔反射(Fresnel Reflection)
    几个稍大场景的渲染测试
    Ward BRDF实现心得
    离线渲染中的不规则光源(Meshlight)
  • 原文地址:https://www.cnblogs.com/guangheli/p/11637727.html
Copyright © 2020-2023  润新知