题目描述:
题目大意:试图把数组(只含 -1 和 1)分成不重复的连续部分,使得所有部分的 alternating sum 的和为0。
思想:构造
首先要明确的一点是,当数组长度为奇数时是不能构造的。当数组长度为奇数时,必定有奇数个 segment 长度为奇数,长度为奇数的 segment 的 alternating sum 必定为奇数,长度为偶数的 segment 的 alternating sum 必定为偶数,所以长度为奇数的数组不可能存在一种构造方法。
如果数组长度为偶数,必定存在一种构造方法。
我们考虑两两一对,下标 2i - 1 和 2i。
假如 =
, 那么我们把这两个数分为一个 segment,他们的 alternating sum 为 0.
假如 !=
, 那我们把这两个数分为两个 segment , 这两个 segment 的 alternating sum的和也为0.
AC代码:
using namespace std;
#include<vector>
#include<algorithm>
#include <numeric>
#include <string>
#define ll long long
#include<set>
#include<bitset>
#include<iostream>
#include<map>
void solve() {
int n; cin >> n;
vector<int> a(n + 1);
int partitions = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i % 2 == 0) {
if (a[i] == a[i - 1]) partitions += 1;
else partitions += 2;
}
}
if (n % 2 == 1) {
cout << -1 << endl; return;
}
cout << partitions << endl;
for (int i = 1; i <= n / 2; i++) {
if (a[2 * i - 1] == a[2 * i]) {
cout << 2 * i - 1 << " " << 2 * i << endl;
}
else {
cout << 2 * i - 1 << " " << 2 * i - 1 << endl;
cout << 2 * i << " " << 2 * i << endl;
}
}
}
int main() {
int t; cin >> t;
while (t--) {
solve();
}
}