fork download
  1. #include <vector>
  2. #include <tuple>
  3. #include <algorithm>
  4.  
  5. // Функция для модификации вектора, создавая непересекающиеся интервалы
  6. void createNonOverlappingIntervals(std::vector<std::tuple<double, double, double, double, int>>& results_out) {
  7. using EventTuple = std::tuple<double, double, double, double, int>;
  8.  
  9. // Сортируем события по времени начала интервала
  10. std::sort(results_out.begin(), results_out.end(),
  11. [](const EventTuple& a, const EventTuple& b) {
  12. return std::get<0>(a) < std::get<0>(b);
  13. });
  14.  
  15. // Если вектор пустой или содержит только одно событие, нет необходимости в обработке
  16. if (results_out.size() <= 1) {
  17. return;
  18. }
  19.  
  20. // Создаем временный вектор для хранения результатов
  21. std::vector<EventTuple> processed;
  22. processed.push_back(results_out[0]);
  23.  
  24. for (size_t i = 1; i < results_out.size(); i++) {
  25. EventTuple current = results_out[i];
  26. EventTuple& last = processed.back();
  27.  
  28. double last_event_end = std::get<3>(last);
  29. double last_interval_end = std::get<1>(last);
  30.  
  31. double current_event_start = std::get<2>(current);
  32.  
  33. // Правило 2: Если текущее событие начинается до конца предыдущего события,
  34. // мы сохраняем только предыдущее событие
  35. if (current_event_start <= last_event_end) {
  36. continue; // Пропускаем текущее событие
  37. }
  38.  
  39. // Правило 3: Если текущее событие начинается после конца предыдущего события,
  40. // но до конца предыдущего интервала
  41. else if (current_event_start > last_event_end &&
  42. current_event_start <= last_interval_end) {
  43. // Корректируем конец интервала предыдущего события
  44. std::get<1>(last) = last_event_end;
  45.  
  46. // Корректируем начало интервала текущего события
  47. std::get<0>(current) = last_event_end;
  48. }
  49.  
  50. // Добавляем текущее событие в результат
  51. processed.push_back(current);
  52. }
  53.  
  54. // Заменяем содержимое исходного вектора обработанными событиями
  55. results_out = std::move(processed);
  56. }
  57.  
  58. #include <iostream>
  59.  
  60. int main() {
  61. // Создаем тестовые данные
  62. std::vector<std::tuple<double, double, double, double, int>> test_data = {
  63. {1717660144617, 1717660152058, 1717660152548, 1717660158178, 1}, // interval_start, interval_end, event_start, event_end, event_id
  64. {1717660145858, 1717660153198, 1717660153639, 1717660158918, 2}
  65. };
  66.  
  67. // Обрабатываем данные, модифицируя исходный вектор
  68. createNonOverlappingIntervals(test_data);
  69.  
  70. // Вывод результата
  71. for (const auto& event : test_data) {
  72. std::cout << "Интервал: [" << std::get<0>(event) << ", " << std::get<1>(event) << "] "
  73. << "Событие: [" << std::get<2>(event) << ", " << std::get<3>(event) << "] "
  74. << "ID: " << std::get<4>(event) << std::endl;
  75. }
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
Интервал: [1.71766e+12, 1.71766e+12] Событие: [1.71766e+12, 1.71766e+12] ID: 1