// #include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <vector>
#include <iomanip>
#include <string>
#include <queue>
#include <set>
#include <deque>
using namespace std;
#define int long long
#define endl "\n"
#define fi first
#define se second
const int M=1e9+7;
const int inf = 1e9;
const int LOG=17;
const int N=2e5+5;
int n , m , c , w , k , t=1 , q=1 , x , y , z , l , r;
void solve(){
cin >> n;
vector<int>a(n+1);
for (int i=1;i<=n;i++){
cin >> a[i];
}
vector<int>in(n+1);
for (int i=1;i<=n;i++){
in[a[i]]=i;
}
c=0;
set<int>l;
set<int>op;
for (int i=1;i<=n;i++){
if (a[i]+a[n-i+1]!=n+1){
cout << -1 << endl;
return;
}
if (i<=n/2 and a[i]==n-i+1){
l.insert(i);
}
if (i<=n/2 and in[i]>n/2){
if (a[i]!=n-i+1){
op.insert(i);
}
c++;
}
}
if (c%2){
cout << -1 << endl;
return;
}
vector<pair<int,int>>p;
for (int i=1;i<=n/2;i++){
if (a[i]==i)continue;
if (a[i]!=n-i+1){
op.erase(i);
p.push_back({i,in[i]});
int x=in[i];
if (x>n/2){
if (a[i]>n/2){
op.erase(n-a[i]+1);
}
else{
op.insert(a[i]);
}
}
swap(a[i],a[x]);
swap(a[n-i+1],a[n-x+1]);
in[a[i]]=i;
in[a[x]]=x;
in[a[n-i+1]]=n-i+1;
in[a[n-x+1]]=n-x+1;
}
else{
int x;
if (l.size()){
x=in[*l.begin()];
l.erase(a[x]);
}
else{
x=in[*op.begin()];
op.erase(a[x]);
}
int y;
if (l.size()){
y=in[*l.begin()];
l.erase(a[y]);
}
else{
y=in[*op.begin()];
op.erase(a[y]);
}
p.push_back({x,n-y+1});
swap(a[x],a[n-y+1]);
swap(a[n-x+1],a[y]);
in[a[x]]=x;
in[a[y]]=y;
in[a[n-x+1]]=n-x+1;
in[a[n-y+1]]=n-y+1;
if (a[i]==i)continue;
p.push_back({i,in[i]});
x=in[i];
swap(a[i],a[x]);
swap(a[n-i+1],a[n-x+1]);
in[a[i]]=i;
in[a[x]]=x;
in[a[n-i+1]]=n-i+1;
in[a[n-x+1]]=n-x+1;
}
}
cout << p.size() << " " << p.size() << endl;
for (auto [x,y]:p){
cout << x << " " << y << endl;
}
}
signed main()
{
// #ifndef ONLINE_JUDGE
// freopen("input.txt","r" ,stdin);
// freopen("output.txt","w",stdout);
// #endif
ios::sync_with_stdio(0);//DO NOT USE IN INTERACTIVE
cin.tie(0), cout.tie(0);//DO NOT USE IN INTERACTIVE
cout << fixed << setprecision(9);
srand(time(0));
// int t=1;
cin >> t;
for (int _=1;_<=t;_++){
solve();
q++;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |