zoukankan      html  css  js  c++  java
  • 洛谷——P3939 数颜色(暴力vecotr+二分)

    P3939 数颜色

    $vecotr$里二分就是好用,全是$STL$

    颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$vector$里二分即可

    交换两个数。。。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    
    #define N 320202
    using namespace std;
    
    vector<int>G[N];
    
    int n,m,c[N];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int x,i=1;i<=n;i++ ){
            scanf("%d",&x);
            G[x].push_back(i),c[i]=x;
        }
        for(int opt,l,r,x,i=1;i<=m;i++){
            scanf("%d",&opt);
            if(opt==1){
                scanf("%d%d%d",&l,&r,&x);
                int L=lower_bound(G[x].begin(),G[x].end(),l)-G[x].begin();
                int R=upper_bound(G[x].begin(),G[x].end(),r)-G[x].begin()-1;
                //>=l <=r
                if(L>R) printf("0
    ");
                else printf("%d
    ",R-L+1);
            }else{
                scanf("%d",&x);
                if(c[x]==c[x+1]) continue;
                l=x,r=x+1;
                int pos_1=lower_bound(G[c[l]].begin(),G[c[l]].end(),l)-G[c[l]].begin();
                int pos_2=lower_bound(G[c[r]].begin(),G[c[r]].end(),r)-G[c[r]].begin();
                G[c[l]][pos_1]++;
                G[c[r]][pos_2]--;
                swap(c[x],c[x+1]);
            }
        }
        
        return 0;
    }
  • 相关阅读:
    集合选数
    二分答案入门乱讲
    浅谈搜索剪枝
    数位DP
    RMQ问题与ST算法
    计数排序与基数排序
    主席树/函数式线段树/可持久化线段树
    树链剖分
    LCA问题
    树的直径、树的重心与树的点分治
  • 原文地址:https://www.cnblogs.com/song-/p/9873029.html
Copyright © 2011-2022 走看看