题目
思路
首先判断是否可以满足题目中的a1+an=a2+an-1....,这种情况下一定时最小的加上最大的=第二小的加上第二大的,以此类推,因此,在判断是否输出YES的时候就对数组进行升序或者降序排列,
然后进行比对判断即可,若是不可以就输出NO,若是可以则输出YES,并且进行如何交换的判断
代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
const int MAXSIZE=200000;
#include<utility>
//定义为全局变量,防止内存不够,下面的first存数据,second存下标位置
pair<int, int>a[MAXSIZE];
pair<int, int>b[MAXSIZE];
void solve()
{
int n = 0;
cin >> n; n++;
for (int i = 1; i < n; i++)//存入数据,定义为从1开始是因为题目中输出交换位置的下标时从1开始的
{
cin >> a[i].first;
a[i].second = i;
b[i] = a[i];
}
sort(b + 1, b + n);//这里时升序排序
int j = n-1;
int x = b[1].first + b[j].first;
for (int i = 1; i <= j; i++,j--)
if (b[i].first + b[j].first != x)//进行判断
{
cout << "NO" << endl;//输出NO则结束
return;
}
for (int i = 1; i < n; i++)
a[b[i].second].second = i;
vector<pair<int, int>>result;//这里向下是寻找如何交换的
for (int i = 1; i < n; i++)
while (a[i].second != i)
result.push_back({ i, a[i].second }), swap(a[i], a[a[i].second]);
cout << "YES\n" << result.size() << endl;
for (auto c : result)
cout << c.first << " " << c.second << endl;
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int t = 0;
cin >> t;
while (t--)
{
solve();
}
return 0;
}