RE
Runtime Error. Received signal 6: Aborted / IOT trap.
代码比较石山,见谅
#include<bits/stdc++.h>
using namespace std;
const int N=1000050;
struct nb{
int num;
int id;
};
bool cmq(nb x,nb y)
{
if(x.num==y.num)return x.id<y.id;
return x.num<y.num;
}
nb a[N]={0};
struct qp{
long long num;
int i,j;
int op;
};
bool operator <(const qp &x,const qp &y)
{
return x.num>y.num;
}
priority_queue<qp>q;
vector<nb>s[2];
int ans[N][2]={0};
int main()
{
int n,m,tt=0;
long long cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+n+1,cmq);
int mn=a[1].id,mx=a[n].id;
for(int i=2;i<n;i++)
{
tt++;
ans[tt][1]=a[i].id;
if(a[i].num>=0)
{
cnt+=(long long)a[i].num*a[1].num;
ans[tt][2]=mn;
s[1].push_back(a[i]);
}
else
{
cnt+=(long long)a[i].num*a[n].num;
ans[tt][2]=mx;
s[2].push_back(a[i]);
}
}
tt++;
ans[tt][1]=a[1].id;
ans[tt][2]=a[n].id;
cnt+=(long long)a[1].num*a[n].num;
reverse(s[1].begin(),s[1].end());
if(s[1].size()&&s[2].size())
{
qp x;
x.i=x.j=0;
x.num=s[1][0].num*s[2][0].num;
x.op=0;
q.push(x);
while(q.size()&&tt<m)
{
x=q.top();
q.pop();
qp y=x,z=x;
if(y.i+1<s[1].size())
{
y.i++;
y.num=s[1][y.i].num*s[2][y.j].num;
q.push(y);
}
if(z.j+1<s[2].size())
{
z.j++;
z.num=s[1][z.i].num*s[2][z.j].num;
q.push(z);
}
tt++;
ans[tt][1]=s[1][x.i].id;
ans[tt][2]=s[2][x.j].id;
cnt+=s[1][x.i].num*s[2][x.j].num;
}
}
reverse(s[1].begin(),s[1].end());
s[1].push_back(a[n]);
reverse(s[2].begin(),s[2].end());
s[2].push_back(a[1]);
qp x;
x.i=0,x.j=1;
if(s[1].size()>1)
{
x.num=s[1][0].num*s[1][1].num;
x.op=1;
q.push(x);
}
if(s[2].size()>1)
{
x.num=s[2][0].num*s[2][1].num;
x.op=2;
q.push(x);
}
while(q.size()&&tt<m)
{
x=q.top();
q.pop();
qp y=x,z=x;
if(y.i+1<s[y.op].size()&&y.i+1<y.j)
{
y.i++;
y.num=s[y.op][y.i].num*s[y.op][y.j].num;
q.push(y);
}
if(z.j+1<s[z.op].size())
{
z.j++;
z.num=s[z.op][z.i].num*s[z.op][z.j].num;
q.push(z);
}
tt++;
ans[tt][1]=s[x.op][x.i].id;
ans[tt][2]=s[x.op][x.j].id;
cnt+=s[x.op][x.i].num*s[x.op][x.j].id;
}
cout<<cnt<<endl;
for(int i=1;i<=tt;i++)
{
cout<<ans[i][1]<<" "<<ans[i][2]<<endl;
}
return 0;
}