社区讨论
二分 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 条回复,欢迎继续交流。
正在加载回复...