题解:P17196 [KOI 2026 #2] 序列运算
注意到一个简单性质,如果存在
另一个性质是,对于最终不在
考虑我们依次将
考虑实现,因为每个数只会被删除一次所以直接使用 vector.erase 即可,交换是简单的。
::::info[时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int N=3005;
vector<pair<int,int>> ans;
vector<int> a;int n,m,b[N],vis[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m,a.resize(n+2,0);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i],vis[b[i]]=1;
for(int i=1;i<=m;i++){
int j=1;
while(a[j]!=b[i]) j++;
while(a[j]<a[j+1]&&!vis[a[j+1]]){
ans.emplace_back(2,j);
a.erase(a.begin()+j+1);
}
while(1){
if(i==j) break;
while(a[j]<a[j-1]&&!vis[a[j-1]]){
ans.emplace_back(2,j-1);
a.erase(a.begin()+j-1),j--;
}
if(i==j) break;
if(a[j]<a[j-1]) return cout<<"NO\n",0;
swap(a[j],a[j-1]),ans.emplace_back(1,--j);
}
}
while(a.size()>m+2){
if(a[m+1]<a[m]) return cout<<"NO\n",0;
a.erase(a.begin()+m+1),ans.emplace_back(2,m);
}
cout<<"YES\n"<<ans.size()<<"\n";
for(auto [x,y]:ans) cout<<x<<" "<<y<<"\n";
}
::::