我既不使用指针也不使用释放的内存,但是我不明白是什么导致sigsegv错误。 对于某些测试用例,该算法可以正常工作,而对于其他测试用例,则显示SIGSEGV。
#include<iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,m;
cin>>n>>m;
int arr[n],arrh[m];
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=0;i<m;i++)
{
cin>>arrh[i];
}
int arrcc[m][n]={0}; //Precomputation Cumulative
int val;
for(int j=0;j<m;j++)
{
val=0;
for(int i=0;i<n;i++)
{
if(arr[i]==(j+1))
{
val++;
}
arrcc[j][i]=val;
}
}
int q,l,r;
cin>>q;
int k;
int arrc[m];
while(q--)
{
k=0;
for(int i=0;i<m;i++)
{
arrc[i]=0;
}
cin>>l>>r;
// for(int j=0;j<m;j++) //Time limit exceed need precomputation
// {
// for(int i=(l-1);i<r;i++)
// {
// if(arr[i]==(j+1))
// {
// arrc[j]++;
// }
// }
// }
for(int j=0;j<m;j++) //Calculating from cumulative
{
if(l!=1)
arrc[j]=(arrcc[j][r-1]-arrcc[j][l-2]);
else
arrc[j]=(arrcc[j][r-1]-0);
}
for(int i=0;i<m;i++)
{
if(arrc[i]!=0)
{
if(arrc[i]!=arrh[i])
{
cout<<"0"<<"\n";
k++;
break;
}
}
}
if(k==0)
{
cout<<"1"<<"\n";
}
}
}
链接到问题-
https://drive.google.com/open?id=1sYEbtdFTT9ZE67y4Wygvv_AKJWGWgXiI
https://www.hackerearth.com/challenges/competitive/april-circuits-20/algorithm/happy-segments-e290faa6/
答案 0 :(得分:4)
cin>>n>>m; int arr[n],arrh[m];
首先,该程序是C ++格式不正确的。自动数组的大小必须是编译时间常数,而n和m不是。
第二,如果您有意使用扩展的C ++语言:通常严格限制自动存储中对象的存储。默认情况下,执行堆栈的大小约为1-8兆字节。对于较大的n或m,这些数组可能会使堆栈溢出,如果幸运的话,将导致程序崩溃。
如果需要运行时大小的数组,请使用动态存储。最简单的解决方案是使用std::vector
。这样就消除了数组溢出堆栈的机会,并使程序在数组大小方面结构良好的C ++。