Почему эта ошибка RE (SIGSEGV) появляется в C ++ при отправке? - PullRequest
0 голосов
/ 09 марта 2020

Во время отправки кода я получил ошибку RE (SIGSEGV). Мой код:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int T,val,v;
    int min = INT_MAX;
    int N,M;
    cin >> T;
    while(T--){
        cin >> N >> M;
        vector<int> vec(M+1,0);
        vector<int> arr1;
        for(int i=0;i<N;i++){
            cin >> v;
            arr1.push_back(v);
        }
        for(int j=0;j<N;j++){
            cin >> val;
            vec[arr1[j]]+=val;
        }
        for(int i=1;i<=M;i++){
            if((vec[arr1[i]])<min && (vec[arr1[i]])!=0){
                min = vec[arr1[i]];
            }
        }
        cout << " box: "<<endl;
        for(int a=0;a<vec.size();a++){
            cout << vec[a] << " ";
        }
        cout << endl;
        cout << min << endl;
        vec.clear();
        arr1.clear();
    }   
    return 0;
}

Ссылка на проблему: https://www.codechef.com/MARCH20B/problems/CHPINTU. Может кто-нибудь сказать мне, почему это происходит? Как я могу преодолеть эту проблему? Спасибо.

1 Ответ

1 голос
/ 09 марта 2020

N может быть меньше, чем M, в этом случае это может привести к ошибкам сегментации:

for(int i=1;i<=M;i++){
    if((vec[arr1[i]])<min && (vec[arr1[i]])!=0){
        min = vec[arr1[i]];
    }
}

Вместо этого вы должны смотреть vec [i] вместо vec [arr1 [i]]

Nit: это все равно даст вам WA (неправильный ответ), но не приведет к SIGSEGV, одна из найденных ошибок - только инициализация min в начале, вместо инициализации INT_MAX в l oop over T

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...