社区讨论

二分 20分求助

P3939数颜色参与者 1已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo8q7ry6
此快照首次捕获于
2023/10/27 22:46
2 年前
此快照最后确认于
2023/10/27 22:46
2 年前
查看原帖
CPP
#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]);
        }
    }
}

回复

3 条回复,欢迎继续交流。

正在加载回复...