zoukankan      html  css  js  c++  java
  • 【题解】P3939数颜色

    【题解】P3939 数颜色

    不要数据结构和模板学傻了...

    考虑到兔子们交换都是相邻的,说明任何一次交换只会引起(O(1))的变化。

    我们开很多(vector)存没种兔子的下标就好了。到时候二分查找查询。

    复杂度(O(nlogn))

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<queue>
    #include<bitset>
    #include<vector>
    #include<map>
    #include<ctime>
    #include<cstdlib>
    #include<set>
    #include<bitset>
    #include<stack>
    #include<list>
    #include<cmath>
    using namespace std;
    #define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t)
    #define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t)
    #define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
    #define Max(a,b) ((a)<(b)?(b):(a))
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define TMP template<class ccf>
    typedef long long ll;
    TMP inline ccf qr(ccf k){
        char c=getchar();
        ccf x=0;
        int q=1;
        while(c<48||c>57)
        q=c==45?-1:q,c=getchar();
        while(c>=48&&c<=57)
        x=x*10+c-48,c=getchar();
        if(q==-1)
        x=-x;
        return x;
    }
    const int maxn=3e5+15;
    int data[maxn];
    vector < int > col[maxn];
    int n,m;
    inline int div(vector < int >& p,int lb,int rb,int k){
        // to lb
        int mid;
        int ret=0;
        do{
        mid=(lb+rb)>>1;
        if(p[mid]>=k)
            rb=mid-1,ret=mid;
        else
            lb=mid+1;
        }while(lb<=rb);
        return ret;
    }
    
    inline int div2(vector < int > &p,int lb,int rb,int k){
        int ret=-1;
        int mid;
        do{
        mid=(lb+rb)>>1;
        if(p[mid]<=k)
            lb=mid+1,ret=mid;
        else
            rb=mid-1;
        }while(lb<=rb);
        return ret;
    }
    
    
    inline void upd(int c,int pos,int to){
        int ret=div(col[c],0,col[c].size()-1,pos);
        if(ret<0)
        return void(cout<<"err!
    ");
        col[c][ret]=to;
    }
    
    inline int cnt(int c,int lb,int rb){
        int ret=0;
        int siz=col[c].size()-1;
        if(siz<0)
        return 0;
        if(rb<col[c][0])
        return 0;
        if(lb>col[c][siz])
        return 0;
        ret+=div2(col[c],0,siz,rb);
        ret-=div(col[c],0,siz,lb);
        return ret+1;
    }
    
    int t1,t2,t3,t4;
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("in.in","r",stdin);
        freopen("out.out","w",stdout);
    #endif
        n=qr(1);
        m=qr(1);
        RP(t,1,n){
        data[t]=qr(1);
        col[data[t]].push_back(t);
        }
        RP(t,1,m){
        t1=qr(1);
        if(t1==1){
            t2=qr(1);
            t3=qr(1);
            t4=qr(1);
            cout<<cnt(t4,t2,t3)<<endl;
        }else{
            t2=qr(1);
            if(data[t2]==data[t2+1])
            continue;
            else{
            upd(data[t2],t2,t2+1);
            upd(data[t2+1],t2+1,t2);
            swap(data[t2],data[t2+1]);
            }
        }
        }
        return 0;
    }
    
    
  • 相关阅读:
    使用 Scrapy 爬取股票代码
    基于python开发的股市行情看板
    基于django的视频点播网站开发
    一个基于php+mysql的外卖订餐网站(带源码)
    线性表概述及单链表的Java实现
    使用github pages搭建个人博客
    解决SpannableString在Android组件间传递时显示失效的问题
    Android进程间通信(一):AIDL使用详解
    Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)
    Linux创建普通用户
  • 原文地址:https://www.cnblogs.com/winlere/p/10333361.html
Copyright © 2011-2022 走看看