洛谷——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\n");
            else printf("%d\n",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;
}

 

posted @ 2018-10-29 20:25  清风我已逝  阅读(234)  评论(0编辑  收藏  举报