CF1754C1

发布时间 2023-05-27 09:37:47作者: wscqwq

题目

首先,如果有奇数个数,那么正负 \(1\) 肯定不能完全抵消,无解。

如果有偶数个数,必定有解,构造方案:

  • 对于每两个位置,如果相同,将这两个数划分为 \(1\) 组。
  • 否则,将两个数各划分为 \(1\) 组。

这样,对于第一种,这个区间是 \(0\),对于第二种,这两个区间的和是 \(0\),显然符合题意。

#include <cstdio>
#include <vector>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define L(i,l) for(int i=1;i<=l;++i)
const int N=200010;
int T,n,a[N];
int main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
    scanf("%d",&T);
    while(T--){
        vector<pair<int, int>>ans;
        scanf("%d",&n);
        L(i, n)scanf("%d",a+i);
        if(n&1)puts("-1");
        else{
            for(int i=1;i<=n;i+=2)
                if(a[i]==a[i+1])ans.emplace_back(i,i+1);
                else ans.emplace_back(i,i),ans.emplace_back(i+1,i+1);
            printf("%d\n",ans.size());
            for(auto v:ans)printf("%d %d\n",v.first,v.second);
        }
    }
    return 0;
}