P3939 数颜色
这道题是暑假写的。但是当时数据结构学傻了,写了个莫队。
然后刚刚发现没过,连忙重新看题。
想了想发现跟可以跟Ynoi有一道区间众数题一个思路处理一下,直接二分就完了。
就记录一下每个数的出现次数。这里还有个小优化可以再记一下每个位置在vector里的下标。
这样子修改不用二分找下标,可以直接swap。
算不算Ynoi那道题的削弱版🤔
点击查看代码
#include<bits/stdc++.h>
#define p_b push_back
#define e_b emplace_back
#define ll long long
#define pii pair<int,int>
#define fir first
#define sec second
#define il inline
#define ios ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
const int N=3e5+5,inf=1e9;
int n,m,a[N];
int pos[N];
vector<int>app[N];
void swap(int &x,int &y){int t=x;x=y,y=t;}
signed main(){
ios;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];app[a[i]].e_b(i);
pos[i]=app[a[i]].size()-1;
}
while(m--){
int op,l,r,c;
cin>>op;
if(op-1){
cin>>c;
int c1=a[c],c2=a[c+1];
if(c1==c2)continue;
int p1=pos[c],p2=pos[c+1];
swap(pos[c],pos[c+1]);
swap(app[c1][p1],app[c2][p2]);
swap(a[c],a[c+1]);
}
else{
cin>>l>>r>>c;
int k=upper_bound(app[c].begin(),app[c].end(),r)-lower_bound(app[c].begin(),app[c].end(),l);
cout<<k<<'\n';
}
}
}

浙公网安备 33010602011771号