Столкновение с проблемой переполнения с проблемой Хакерранка - PullRequest
0 голосов
/ 28 апреля 2020

У меня странная проблема переполнения с Hackerrank Problem . Вот краткое изложение задачи.

Существует двумерный массив, и в каждой строке массива есть строки, начинающиеся в одной ячейке и заканчивающиеся в другой ячейке (слева направо в той же строке). Теперь в одном ряду может быть несколько строк, и они, безусловно, могут перекрывать друг друга. Задача состоит в том, чтобы найти количество незанятых ячеек в двумерном массиве.

Важно отметить, что размеры массива могут быть очень большими вплоть до 10^9. Так что это был мой подход

  • Использовать карту, в которой в качестве ключа указан номер строки, а в качестве соответствующего значения - вектор пар. Пары - это не что иное, как начальный и конечный индексы строки в этой строке. row -> vector<pair<int, int>>
  • Сортировать каждый такой вектор по первому элементу пары (то есть по начальному индексу интервала).
  • Объединить перекрывающиеся интервалы для всех строк. Для каждого объединенного интервала рассчитайте его длину wR - wL + 1, где wL и wR - начальный и конечный индексы интервала соответственно. Добавьте длину всех этих интервалов и сохраните в переменной sum
  • Наконец, вычтите это sum из n*m, чтобы получить количество незанятых ячеек.

Здесь это соответствующий код

#include <bits/stdc++.h>
#define pii pair<int, int>
#define mp make_pair
#define ulld unsigned long long int
#define ff first
#define ss second
using namespace std;

void sortMap(unordered_map<int, vector<pii>> &dict){
    unordered_map<int, vector<pii>>::iterator it;
    for(it=dict.begin(); it!=dict.end(); it++){
        vector<pii> &temp = it->second;
        sort(temp.begin(), temp.end());
    }
}

ulld compute(unordered_map<int, vector<pii>> &dict, int n, int m){
    unordered_map<int, vector<pii>>::iterator it;
    ulld sum = 0;
    for(it = dict.begin(); it != dict.end(); it++){
        vector<pii> temp = it->second;
        int n = temp.size();
        int WL = temp[0].ff, 
            WR = temp[0].ss;

        for(int i=0; i<n-1; i++){
            if(WR >= temp[i+1].ff && WR < temp[i+1].ss){
                // partial overlap
                WR = temp[i+1].ss;
            }else if(WL <= temp[i+1].ff && WR >= temp[i+1].ss){
                // complete overlap
                // nothing to consider here
            }else{
                // no overlap
                // compute the exisiting window size so far
                sum += WR - WL + 1;
                WL = temp[i+1].ff;
                WR = temp[i+1].ss;
            }
        }
        sum += (WR - WL + 1);
    }
    ulld ans = ((ulld)n * (ulld)m) - sum;
    return ans;
}

// Complete the gridlandMetro function below.
ulld gridlandMetro(int n, int m, int k, vector<vector<int>> track) {
    unordered_map<int, vector<pii>> dict;
    for(int i=0;i<k;i++){
        int row = track[i][0]-1;
        pii bounds = mp(track[i][1]-1,track[i][2]-1);

        if(dict.find(row) == dict.end()){
            vector<pii> temp;
            temp.push_back(bounds);
            dict.insert(pair<int, vector<pii>>(row, temp));
        }else{
            vector<pii> temp = dict[row];
            temp.push_back(bounds);
            dict[row]=temp;
        }
    }
    sortMap(dict);
    return compute(dict, n, m);
}

Я разблокировал конкретный контрольный пример, для которого код не удался. Этот тестовый набор состоит из больших чисел порядка 10^9, а результат - порядка 10^18, что соответствует ожиданиям.

Я не понимаю, почему я получаю отрицательные значения мусора при работе с большими числами, несмотря на использование соответствующих типов данных: long long, unsigned long long int?

Буду очень признателен за помощь в этом! Спасибо за проявленное терпение.

1 Ответ

0 голосов
/ 28 апреля 2020

Отвечая на мой собственный вопрос, когда я только что выяснил проблему. Проблема была с предварительно написанным кодом или шаблоном, который был предоставлен. Он ожидал целое число, пока мой код возвращал большее значение. Так что изменение,

int result = gridlandMetro(n, m, k, track); на

ulld result = gridlandMetro(n, m, k, track); исправило это.

Я не ожидал, что шаблонный код будет ошибочным.

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