Parity Shuffle Sorting
思路
让
我
们
在
n
次
操
作
内
把
这
个
数
列
变
为
不
降
序
的
,
所
以
我
们
可
以
把
这
个
序
列
全
部
变
为
一
个
数
让我们在n次操作内把这个数列变为不降序的,所以我们可以把这个序列全部变为一个数
让我们在n次操作内把这个数列变为不降序的,所以我们可以把这个序列全部变为一个数
具
体
操
作
是
选
择
两
个
元
素
,
和
为
奇
数
就
是
r
=
l
,
偶
数
就
是
l
=
r
具体操作是选择两个元素,和为奇数就是 r=l,偶数就是l=r
具体操作是选择两个元素,和为奇数就是r=l,偶数就是l=r
我
们
可
以
先
把
两
头
先
操
作
一
次
变
为
一
个
数
我们可以先把两头先操作一次变为一个数
我们可以先把两头先操作一次变为一个数
然
后
中
间
的
看
是
奇
数
就
和
第
一
个
操
作
,
是
偶
数
就
和
最
后
一
个
操
作
,
恰
好
n
−
1
次
然后中间的看是奇数就和第一个操作,是偶数就和最后一个操作,恰好n-1次
然后中间的看是奇数就和第一个操作,是偶数就和最后一个操作,恰好n−1次
全
都
是
思
维
!
全都是思维!
全都是思维!
代码
#include<bits/stdc++.h>
const int N = 1e5+10;
using namespace std;
int t, n, arr[N];
int main()
{
cin >> t;
while(t--)
{
cin >> n;
for(int i = 1;i <= n; i ++)
{
scanf("%d", &arr[i]);
}
if(n == 1)
{
puts("0");
continue;
}
vector<pair<int,int>> res;
res.clear();
res.push_back({1, n});
if((arr[1] + arr[n]) % 2)
{
arr[n] = arr[1];
}
else
{
arr[1] = arr[n];
}
for(int i = 2; i < n; i++)
{
if((arr[i] + arr[1]) % 2)
{
arr[i] = arr[1];
res.push_back({1,i});
}
else
{
arr[i] = arr[n];
res.push_back({i,n});
}
}
cout << res.size() << endl;
for(auto [a,b]: res)
{
printf("%d %d\n",a,b);
}
}
return 0;
}