又发现了新的错误类型(求助帖)
查看原帖
又发现了新的错误类型(求助帖)
1078013
qsn123楼主2024/10/21 23:17

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;
}
2024/10/21 23:17
加载中...