二分 20分求助
  • 板块P3939 数颜色
  • 楼主oilgz
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/6/23 14:19
  • 上次更新2023/10/27 22:46:24
查看原帖
二分 20分求助
542961
oilgz楼主2022/6/23 14:19
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N=3e5+10;
int n;
vector<int> p[N];
int a[N];
int main()
{
    int m;
    cin>>n>>m;
    for(int i=1;i<N;i++)p[i].push_back(-1e9);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        p[x].push_back(i);
        a[i]=x;
    }
    for(int i=1;i<N;i++)p[i].push_back(1e9);
    while(m--){
        int pos;
        scanf("%d",&pos);
        if(pos==1){
            int x,y,c;
            scanf("%d%d%d",&x,&y,&c);
            int l=0,r=p[c].size()-1;
            while(l<r){
                int mid=(l+r)>>1;
                
                if(p[c][mid]>=x)r=mid;
                else l=mid+1;
            }
            x=l;
            l=0,r=p[c].size()-1;
            while(l<r){
                int mid=(l+r+1)>>1;
                if(p[c][mid]<=y)l=mid;
                else r=mid-1;
            }
            if(l<x)printf("0\n");
            else printf("%d\n",(l-x+1)); 
            
        }
        else{
            int x,y;
            scanf("%d",&x);
            int l=0,r=p[a[x]].size()-1;
            while(l<r){
                int mid=(l+r+1)>>1;
                if(p[a[x]][mid]<=x)l=mid;
                else r=mid-1;
            }
            y=l;
            l=0,r=p[a[x+1]].size()-1;
            while(l<r){
                int mid=(l+r+1)>>1;
                if(p[a[x+1]][mid]<=x+1)l=mid;
                else r=mid-1;
            }
            swap(p[a[x]][y],p[a[x+1]][l]);
        }
    }
}
2022/6/23 14:19
加载中...