Почему я получаю ошибку SIGABRT при использовании bitset в stl? - PullRequest
0 голосов
/ 02 мая 2020

Следующий код прекрасно работает с моим компилятором g ++. Но при подаче его на онлайн-судью выдает ошибку SIGABRT. Я читал, что элементы stl могут генерировать эту ошибку, если они пытаются получить слишком много памяти. Я не вижу такого использования памяти. Это счет? Я ввел свой счетчик, но он все равно выдает ту же ошибку.

#pragma GCC optimize ("-O2")
#include <bits/stdc++.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)

#define M 100
void range_change(bitset<M>& x, int lower, int upper, bool change){
    if (change){
     for (unsigned i = lower; i <= upper; ++i)
              x.set(i);
     }
    else{
    for (unsigned i = lower; i <= upper; ++i)
              x.reset(i);
     }
    }
int count_Set(bitset<M> & x){
    int count = 0;
    for(int i = 0; i< 100; i++){
        if(1 & x[i]) count++;
    }
    return count;
}

bitset<100> houses;

int main(){
    fastio;
    int t;
    cin>> t;
    int m, x, y;
    int reach{0};
    int lower{0}, upper{0};
    // int t = 1;
    while(t--){

        houses.set();
        // cout<< houses;
        cin >> m >> x >> y;
        reach = x*y;
        vector<int> cat(m, 0);
        for(auto& u: cat){
            cin>> u;

            lower = u - reach -1;
            if(lower < 0) lower = 0;
            upper = u + reach-1;
            if(upper > 100) upper = 99;
            range_change(houses, lower, upper, false);
        }
        // cout<< houses << "\n";
         cout<< houses.count() << "\n";
       // cout<< count_Set(houses) << "\n";

 }
    return 0;
}

1 Ответ

2 голосов
/ 02 мая 2020

Просто просматривая исходный код, вот что я вижу:

#define M 100
...
bitset<100> houses;

Похоже, вы хотите использовать M вместо 100 для безопасности.

Тогда вот:

if(upper > 100) upper = 99;

Это сломается в upper = 100 Предложить:

if(upper >= M) upper = M - 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...