所以我正在HackerEarth处理一个问题,它要求我存储一个大小为10 ^ 9的整数数组。 我试图使用向量存储数组,但当我尝试提交我的解决方案时,我得到运行时错误SIGABRT。 这是我的代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
unsigned int h, c, q;
cin >> h >> c >> q;
vector<unsigned int> minht(h + 1);
for (unsigned int i = 0; i <= h; i++)
minht[i] = 0;
unsigned int hc, st, et;
for (unsigned int i = 1; i <= c; i++)
{
cin >> hc >> st >> et;
for (unsigned int j = 1; j <= h; j++)
{
if (j >= st && j <= et)
{
if (hc > minht[j])
minht[j] = hc;
}
}
}
unsigned int hq, tq;
for (unsigned int i = 1; i <= q; i++)
{
cin >> hq >> tq;
if (hq > minht[tq])
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
当h
的值不是很大(10 ^ 9)时代码工作正常但是当h
的值非常大时我得到SIGABRT。
任何建议?
编辑: 所以我尝试重写我的整个代码,我的新代码如下所示:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
unsigned int h,c,q,mh=0;
cin>>h>>c>>q;
vector<unsigned int> hc(c+1);
vector<unsigned int> st(c+1);
vector<unsigned int> et(c+1);
for(unsigned int i=1;i<=c;i++)
{
cin>>hc[i]>>st[i]>>et[i];
if(mh<hc[i])mh=hc[i];
}
unsigned int ht,ti;
for(unsigned int i=1;i<=q;i++)
{
int flag=0;int ct=0;
cin>>ht>>ti;
if(ht<=mh)
{
for(unsigned int j=1;j<=c;j++)
{
if(ti>=st[j] && ti<=et[j])
{
if(ht<=hc[j])
{
ct=1;break;
}
}
}
}
if(ct==0)cout<<"YES\n";
else cout<<"NO\n";
}
}
现在接受了解决方案。 我所做的是重新设计算法,以便不必存储1个非常大的4 GB数组,我必须存储3个LARGE数组,每个最大40 MB。
所以问题现在已经解决,但我仍然不认为这个问题与内存问题有关。
因为当我尝试创建大小为int
的{{1}}向量时,为了测试在线编译器,我得到了一个特定的10E8
错误。但当我将尺寸更改为Memory Limit Exceeded
时,我再次获得了10E9
。因此,尽管存在内存问题,但SIGABRT
是由声明SIGABRT
大小的数组引起的。
任何想法可能导致这个?
另外,我首先在自己的编译器上创建程序,然后在线提交。我无法在我的设置上调试程序,因为程序要求我在遇到错误之前输入10E9
数据值,所以我认为在HackerEarth上这样做会更容易。