题解:
贪心,如果负数有奇数个,则将绝对值最小的那个负数变成0,然后把0乘起来最后删掉0。
把剩下的数乘起来即可。
#include<bits/stdc++.h>
const int N=2e5+5;
const int inf=1e9+5;
using namespace std;
int n,cnt2,a[N],cnt1,t;
pair<int,int> mn;
int main()
{
scanf("%d",&n);
mn=make_pair(inf,0);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)cnt1++;
if(a[i]<0)
{
cnt2++;
mn=min(mn,make_pair(-a[i],i));
}
}
if(cnt2&1)a[mn.second]=0;
int k=-1;
for(int i=1;i<=n;i++)
{
if(a[i]!=0)continue;
if(k==-1)k=i;else
{
printf("%d %d %d\n",1,k,i);
k=i;t++;
}
}
if(k!=-1&&t<n-1)printf("%d %d\n",2,k);
k=-1;
for(int i=1;i<=n;i++)
{
if(a[i]==0)continue;
if(k==-1)k=i;else
{
printf("%d %d %d\n",1,k,i);
k=i;
}
}
return 0;
}