【题解】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:反思

递推思想

posted @ 2026-07-15 15:08  Aistyr  阅读(10)  评论(0)    收藏  举报