【题解】CF2246F
1:无解
首先判断无解情况
发现当n为偶数且逆序对个数为奇数时无解
2
我们按照递推的角度考虑
假设我们已经构造出了 \(\{....,1,2,3,4,...,x\}\)
我们需要将 \(x+1\) 添加到末尾
如果 \(x+1\) 不在开头 \(cl(tp_{x+1}-1)\)
否则 \(cl(2),cl(1),cl(n-1)\)
3
我们发现有两种特殊情况
\(\{n-1,n,1,2....n-2\}\) 和 \(\{n,n-1,1,2,...n-2\}\)
需要特殊构造,见代码
4:代码
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int a[N];
int b[N];
vector<int> as;
int n;
void cl(int x){
as.push_back(x);
for(int i=x;i>1;i--) swap(a[i],a[i-1]);
for(int i=x+1;i<n;i++) swap(a[i],a[i+1]);
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(n%2==0){
int res=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[i]>a[j]) res++;
}
}
if(res&1){
cout<<-1<<"\n";
return ;
}
}
as.clear();
for(int cur=1;cur<=n-2;cur++){
int tp=0;
for(int i=1;i<=n;i++){
if(a[i]==cur){
tp=i;
break;
}
}
if(tp>1){
cl(tp-1);
}
else{
cl(2);
cl(1);
cl(n-1);
}
}
if(a[1]==n-1&&a[2]==n){
cl(1);
for(int i=1;i<=n-2;i++) cl(n-1);
}
else{
cl(1);
for(int i=1;i<=n-2;i++) cl(2);
cl(1);
}
cout<<as.size()<<"\n";
for(auto v:as) cout<<v<<" ";
cout<<"\n";
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--) solve();
return 0;
}
5:反思
递推思想

浙公网安备 33010602011771号