思路:这个题需要先找到那个绝对值最小的负数,如果负数为奇数个,就和0一起去掉;如果负数为偶数个就把零去掉就行,正数有条件的话就乘上。
需要注意一点:千万不要用cin和cout,会超时的,当时一直在超时,改掉cin就过了。
代码有的地方重复,有时间再改:
#include<bits/stdc++.h>
using namespace std;
int l[220000],z[220000],f[220000];
int a[220000];
int main()
{
int n,ling=0,zheng=0,fu=0,mmh=0,tmpd,tmph,wei;
int mmd=-2000000000;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<0) {
fu++;f[fu]=i;
if(mmd<a[i]){
mmd=a[i];
mmh=i;
wei=fu;
}
}
else if(a[i]>0){zheng++;z[zheng]=i;}
else {ling++;l[ling]=i;}
}
if(fu>0){
tmph=f[fu];
f[fu]=mmh;
f[wei]=tmph;}
if(ling==0)
{
if(fu%2==0){
for(int i=1;i<n;i++){
cout<<1<<" "<<i<<" "<<i+1<<endl;
}
}
if(fu%2!=0){
cout<<2<<" "<<f[fu]<<endl;
for(int i=1;i<fu-1;i++){
cout<<1<<" "<<f[i]<<" "<<f[i+1]<<endl;
}
if(zheng==1&&fu>1){cout<<1<<" "<<f[fu-1]<<" "<<z[1]<<endl;}
if(zheng>1){
if(fu>1){
cout<<1<<" "<<f[fu-1]<<" "<<z[1]<<endl;
for(int i=1;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
else{
cout<<1<<" "<<z[1]<<" "<<z[2]<<endl;
for(int i=2;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
}
}
}
else if(ling>=1)
{
for(int i=1;i<ling;i++){
cout<<1<<" "<<l[i]<<" "<<l[i+1]<<endl;
}
if(fu%2==0){
if(zheng!=0||fu!=0){
cout<<2<<" "<<l[ling]<<endl;}
if(fu>0){
for(int i=1;i<fu;i++){
cout<<1<<" "<<f[i]<<" "<<f[i+1]<<endl;
}
if(zheng>0){
cout<<1<<" "<<f[fu]<<" "<<z[1]<<endl;
for(int i=1;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
}
if(fu==0){
for(int i=1;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
}
if(fu%2!=0){
cout<<1<<" "<<l[ling]<<" "<<f[fu]<<endl;
if(fu>1||zheng>0){
cout<<2<<" "<<f[fu]<<endl;}
for(int i=1;i<fu-1;i++){
cout<<1<<" "<<f[i]<<" "<<f[i+1]<<endl;
}
if(zheng==1&&fu>1){cout<<1<<" "<<f[fu-1]<<" "<<z[1]<<endl;}
if(zheng>1){
if(fu>1){
cout<<1<<" "<<f[fu-1]<<" "<<z[1]<<endl;
for(int i=1;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
else{
cout<<1<<" "<<z[1]<<" "<<z[2]<<endl;
for(int i=2;i<zheng;i++){
cout<<1<<" "<<z[i]<<" "<<z[i+1]<<endl;
}
}
}
}
}
}