题解:CF1698F Equal Reversal
好题。
通过对操作的观察和手玩,你感觉到这个操作貌似不会改变数代表的颜色之间的相邻关系,于是你可以把每个颜色建点,然后
考虑说明这个条件同时是充分的,我们直接来构造说明。
考虑假若现在
顺着这个证明思路,直接从前往后暴力构造即可做到
#include<bits/stdc++.h>
using namespace std;
vector< pair<int,int> > opt;
bool solve(int a[],int b[],int n,int pos){
if(pos==n) return true;
if(a[pos]==b[pos]) return solve(a,b,n,pos+1);
else{
if(pos==0) return false;
for(int i=pos+1;i+1<n;i++){
if(a[i]==b[pos]&&a[i+1]==b[pos-1]){
reverse(a+pos,a+i+1);
opt.push_back(make_pair(pos,i+2));
return solve(a,b,n,pos+1);
}
}
vector<int> vis;
vis.resize(n);
for(int i=pos;i+1<n;i++){
if(a[i]==b[pos-1]&&a[i+1]==b[pos]) vis[i]=1;
}
for(int i=1;i<n;i++) vis[i]+=vis[i-1];
for(int i=pos-1;i<n;i++){
bool flag=false;
for(int j=i+1;j<n;j++){
if(a[i]==a[j]&&vis[i]!=vis[j-1]){
reverse(a+i,a+j+1);
opt.push_back(make_pair(i+1,j+1));
flag=true;
break;
}
}
if(flag==true) break;
}
for(int i=pos+1;i+1<n;i++){
if(a[i]==b[pos]&&a[i+1]==b[pos-1]){
reverse(a+pos,a+i+1);
opt.push_back(make_pair(pos,i+2));
return solve(a,b,n,pos+1);
}
}
return false;
}
}
void work(){
int n;
cin>>n;
opt.clear();
int a[501],b[501];
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
if(solve(a,b,n,0)==true){
cout<<"YES\n";
cout<<opt.size()<<'\n';
for(pair<int,int> now:opt) cout<<now.first<<" "<<now.second<<'\n';
}else{
cout<<"NO\n";
}
return ;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--) work();
return 0;
}
/*
1
9
3 3 3 3 3 4 1 3 3
3 3 3 3 4 1 3 3 3
*/