C1. Dual (Easy Version)

发布时间 2023-08-08 17:22:02作者: Simex

link
像这种构造题可以先分类讨论一波
比如说全是正数或者全是负数,那么显然的就是可以用前缀和和后缀和来解决。
而如果有正有负呢?可以注意到的是数字非常小,而\(2^5=32>20\)了,那么我们就可以先随便找到一个正数,把他自加上5次,然后第二个数加上它2次
之后的数加上前面的数两次,这样结果一定是递加的。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<bitset>
using namespace std;
int t;
int n;
int a[30];
int po;
int ne;
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		po=ne=0;
		for(int i=1;i<=n;++i){
			scanf("%d",&a[i]);
			if(a[i]>0) po=i;
			if(a[i]<0) ne=i;
		}
		if(po==0&&ne==0){
			cout<<0<<endl;
			continue;
		}
		if(po==0){
			cout<<n-1<<endl;
			for(int i=n;i>1;--i){
				cout<<i-1<<" "<<i<<endl;
			}
			continue;
		}
		if(ne==0){
			cout<<n-1<<endl;
			for(int i=1;i<n;++i){
				cout<<i+1<<" "<<i<<endl;
			}
			continue;
		}
		cout<<(n-1)*2+5<<endl;
		for(int i=1;i<=5;++i){
			printf("%d %d\n",po,po);
		}
		printf("2 %d\n2 %d\n",po,po);
		for(int i=3;i<=n;++i){
			printf("%d %d\n%d %d\n",i,i-1,i,i-1);
		}
	}
	return 0;
}