题意
每次选择l r两个数 如果a[l]+a[r]为奇数 则 a[r]=a[l] else a[l]=a[r]
求是否能够形成非递减序列
不限次数
乍一看比较复杂 可能性太多
我们只需要把他们变成一样的就可以了
考虑 a[n]
- 如果a[n] 为偶数 并且 a[1] 为偶数 可以先将1- (N-1) 的偶数 与n结合 变成a[n]
再将1-(n-1)的奇数与a[1]结合 同样的也变成了a[n] 就构成了一样的序列 - 如果a[n] 为奇数 并且 a[1] 为奇数 可以先将1- (N-1) 的奇数 与n结合 变成a[n]
再将1-(n-1)的偶数与a[1]结合 同样的也变成了a[n] 就构成了一样的序列 - 如果a[n] 为偶数 并且 a[1] 为奇数 首先结合 1 n 使得a[n]变成奇数 构造成第二种情况
- 如果a[n] 为奇数并且 a[1] 为偶数 首先结合 1 n 使得a[n]变成偶数 构造成第一种情况
代码实现有很多 模拟如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100080];
ll b[100080];
int main(){
int t; cin>>t;
while(t--){
int n; cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(n==1) {
cout<<0<<'\n'; continue;
}
cout<<n-1<<'\n';
if(a[n]&1==0){
if(a[1]%2==1){
cout<<1<<' '<<n<<'\n';
for(int i=2;i<n;i++){
if(a[i]%2==1) cout<<i<<' '<<n<<'\n';
}
for(int i=2;i<n;i++){
if(a[i]%2==0) cout<<1<<' '<<i<<'\n';
}
}else{
for(int i=1;i<n;i++){
if(a[i]%2==0) cout<<i<<' '<<n<<'\n';
}
for(int i=2;i<=n;i++){
if(a[i]%2==1) cout<<1<<' '<<i<<'\n';
}
}
}else{
if(a[1]%2==0){
cout<<1<<' '<<n<<'\n';
for(int i=2;i<n;i++){
if(a[i]%2==0) cout<<i<<' '<<n<<'\n';
}
for(int i=2;i<n;i++){
if(a[i]%2==1) cout<<1<<' '<<i<<'\n';
}
}else{
for(int i=1;i<n;i++){
if(a[i]%2==1) cout<<i<<' '<<n<<'\n';
}
for(int i=2;i<n;i++){
if(a[i]%2==0) cout<<1<<' '<<i<<'\n';
}
}
}
}
return 0;
}