c++runtime-errorsigabrtgreedy

How do I resolve sigabrt error on codechef ide


Sigabrt runtime error occurs of a fatal error, because of an assert statement not returning true? Or use of excessive memory, I'm not able to figure out what I'm doing wrong here, help me out?

( problem 1343 C on codeforces) link so here's the code.

#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i,vector<int> a) {
    if (a[i] > 0) {
        return 1;
    }
    else return 0;
}

int main() {
    int t;
    cin >> t;
    while (t--) 
    {
        long int n;
        cin >> n;
        vector<int> a(n), b;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        int i = 0;
        while (i < n)
        {
            int max = a[i];
            int s = check(i,a);
            i++;

            while (i<n && check(i,a)== s) {
                if (a[i] > max)max = a[i];
                i++;    
            }
            b.push_back(max);
        }
        int s = 0;
        for (int k = 0; k< b.size(); k++) {
            s += b[i];
        }
        cout << s << endl;
    }
}




Solution

  • I have debugged your code and also the modified code has been accepted for the above question.

    Mistakes you made:

    1. In the below loop, value at i'th index of vector<int> b is being added to long int s. Instead, b[k] should be added to long int s because the variable being used in the loop is k not i.

    for (int k = 0; k< b.size(); k++) {
                s += b[i];
            }
    

    2. In the question, range of variable n is given as (1 ≤ n ≤ 2.10^5). So, it is safe to use int n instead of long int n. Also, when I submitted my code on codeforces it gave me signed integer overflow error when I used long int n.

    3. You need to use long long s instead of long int s because the value of each element of array A lies between (−10^9 ≤ a[i] ≤ 10^9 , ai ≠ 0) and when we add the elements it can easily surpass int and long int ranges.

    4. Although, the answer got accepted when I used vector<int> a in the function

    int check(int i,vector<int> a) {
        if (a[i] > 0) {
            return 1;
        }
        else return 0;
    }
    

    But as the user Scheff has said and is correct that it comes with a penalty in space and time, you should use call by reference i.e. vector<int> &a.

    Modified Code:

    #include <iostream>
    #include <stdlib.h>
    #include<vector>
    using namespace std;
    int check(int i, vector<int> &a) {
        if (a[i] > 0) {
            return 1;
        }
        else return 0;
    }
    
    int main() {
        int t;
        cin >> t;
        while (t--) 
        {
            int n;
            cin >> n;
            vector<int> a(n), b;
            for (int i = 0; i < n; i++) {
                cin >> a[i];
            }
            
            
            int i = 0;
            while (i < n)
            {
                int max = a[i];
                int s = check(i,a);
                i++;
    
                while ((i<n) && (check(i,a)== s)) {
                    if (a[i] > max)
                    max = a[i];
                    i++;    
                }
                b.push_back(max);
            }
            
            long long s = 0;
            for (int k = 0; k< b.size(); k++) {
                s += b[k];
            }
            cout << s << endl;
        }
    }
    

    Screenshot of Accepted Answer: