給你一個數組 a a a ,其中有 n n n 個非負整數。你可以對它進行以下操作。
選擇兩個索引 l l l 和 r r r ( 1 ≤ l < r ≤ n ) ( 1≤l<r≤n ) (1≤l<r≤n)。
如果 a l + a r a_l+a_r al?+ar? 是奇數,則進行 a r : = a l a_r:=a_l ar?:=al? 運算。如果 a l + a r a_l+a_r al?+ar? 是偶數,則執行 a l : = a r a_l:=a_r al?:=ar? .求最多有 n n n 次操作的序列,使得 a a a 不遞減。可以證明這總是可能的。需要注意的是,你并不需要盡量減少運算次數。
當且僅當 a 1 ≤ a 2 ≤ … ≤ a n a_1≤a_2≤…≤a_n a1?≤a2?≤…≤an? 時,數組 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1?,a2?,…,an? 是非遞減的。
輸入
第一行包含一個整數 t ( 1 ≤ t ≤ 1 0 5 ) t ( 1≤t≤10^5 ) t(1≤t≤105) - 測試用例數。
每個測試用例由兩行組成。每個測試用例的第一行包含一個整數 n ( 1 ≤ n ≤ 1 0 5 ) n ( 1≤n≤10^5 ) n(1≤n≤105) - 數組的長度。
每個測試用例的第二行包含 n n n 個整數 a 1 , a 2 , … , a n ( 0 ≤ a i ≤ 1 0 9 ) a_1,a_2,…,a_n ( 0≤a_i≤10^9 ) a1?,a2?,…,an?(0≤ai?≤109) - 數組本身。
保證所有測試用例中 n n n 的總和不超過 1 0 5 10^5 105 。
輸出
對于每個測試用例,在第一行打印一個整數 m ( 0 ≤ m ≤ n ) m ( 0≤m≤n ) m(0≤m≤n),即操作次數。
然后打印 m m m 行。每行必須包含兩個整數 l i , r i l_i,r_i li?,ri? ,即在 i ? t h i -th i?th 操作中選擇的索引 ( 1 ≤ l i < r i ≤ n ) ( 1≤l_i<r_i≤n ) (1≤li?<ri?≤n)。
如果有多個解,請打印任意一個。
不遞增就是 a i < = a i + 1 a_i <= a_{i+1} ai?<=ai+1? ,那么就可以取一個特殊情況讓所有數都相等,這樣就是簡單的構造方法。
還需要處理奇偶數的問題。
并且注意讀題,奇偶數是操作相反而不是不能操作,本人讀題的時候就讀了半句話發現題做不出來。
首先讓 a [ 1 ] a[1] a[1] 和 a [ n ] a[n] a[n] 相等,如果兩者相加是偶數,那么就是讓 a [ 1 ] = a [ n ] a[1] = a[n] a[1]=a[n],所以之后的目標就是讓所有數都等于 a [ n ] a[n] a[n],相加等于奇數時同理。
以相加為偶數為例,之后,如果中間的任何數和 a [ n ] a[n] a[n] 相加等于奇數,那么就意味著要讓 a [ r ] = a [ l ] a[r] = a[l] a[r]=a[l] ,我們要讓 a [ l ] = a [ n ] a[l] = a[n] a[l]=a[n],但是題目要求 l < r l < r l<r,所以就輸出 1 i
,如果中間的任何數和a[n]相加等于偶數,就意味著要讓 a [ l ] = a [ r ] a[l] = a[r] a[l]=a[r],那么就讓 a [ r ] = a [ n ] a[r] = a[n] a[r]=a[n],就輸出 i n
。
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;int a[N];void solve(){int n;cin >> n;bool ok = 1;for(int i = 1;i <= n;i++){cin >> a[i];if(a[i] < a[i-1])ok = 0;}if(ok){cout << 0 << endl;return;}cout << n-1 << endl;cout << 1 << ' ' << n << endl;int x;if((a[1] + a[n]) % 2 == 0){x = a[n];}else x = a[1];for(int i = 2;i <= n-1;i++){if((x + a[i]) % 2 != 0)cout << 1 << " " << i << endl;else cout << i << " " << n << endl;}
}int main(){int T;cin >> T;while(T--){solve();}return 0;
}