Продолжайте получать сообщение об ошибке выполнения (SIGSEGV) на веб-сайте программирования, даже если это работает в моей системе - PullRequest
0 голосов
/ 16 мая 2019

Я решаю эту проблему https://www.codechef.com/problems/FGFS. Я не могу найти причину, по которой я получаю ошибку времени выполнения (SIGSEGV). Код работает в моей системе, но я не могу найти, где ошибка.

Сначала я думал, что получаю ошибку, потому что я не учел крайний случай (N = 0) и обращался к нераспределенной памяти через итераторы, но я все еще получаю ошибку времени выполнения даже после ее исправления.

Мой код:

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>

using namespace std;

struct Interval
{
    int s, f;
    Interval(int _s = 0, int _f = 0)
        : s(_s), f(_f) {}
    friend istream& operator>> (istream& in, Interval& I)
    {
        return in >> I.s >> I.f;
    }
};

class Comparator
{
public:
    bool operator() (const Interval& I1, const Interval& I2) const
    {
        return I1.f < I2.f;
    }
};

bool intersect(const Interval& I1, const Interval& I2)          // two intervals intersect if the departure time of the first is greater than the arrival time of the second (Note that they are already sorted according to Comparator())
{
    return I1.f > I2.s;
}

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        int N, K;
        cin >> N >> K;

        if (N == 0)
        {
            cout << 0 << endl;
            continue;
        }

        unordered_map<int, vector<Interval>> R;
        for (int i = 0; i < N; ++i)
        {
            Interval I;
            int p;
            cin >> I >> p;

            R[p].push_back(I);
        }

        for (auto itr = R.begin(); itr != R.end(); ++itr)
            sort(itr->second.begin(), itr->second.end(), Comparator());     // sort the vector at each compartment based on the departure time of the customers

        int count = 0;
        for (auto itr = R.cbegin(); itr != R.cend(); ++itr)
        {
            const vector<Interval>& C = itr->second;

            ++count;
            size_t k = 0;
            for (size_t i = 1; i < C.size(); ++i)                           // greedy algorithm to count the size of the maximal set of non-conflicting intervals at that respective compartment
                if (!intersect(C[k], C[i]))
                {
                    ++count;
                    k = i;
                }
        }

        cout << count << endl;
    }
}

Ограничения:

1 ≤ T ≤ 30
0 ≤ N ≤ 105
1 ≤ K ≤ 109
0 ≤ si < fi ≤ 109
1 ≤ pi ≤ K

Пример ввода и вывода:

Введите:

2
3 3
1 3 1
4 6 2
7 10 3
4 2
10 100 1
100 200 2
150 500 2
200 300 2

Выход:

3
3

Получение ошибки времени выполнения (SIGSEGV) на веб-сайте, но отлично работает в моей системе.

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