TrickmanOff

tink06

Mar 21st, 2022 (edited)
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <unordered_map>
  5.  
  6. using namespace std;
  7.  
  8. // nums[l:r] \in (lb, rb)
  9. void move_window(const vector<int> &nums, int lb, int rb, int &l, int &r) {
  10.     while (r < nums.size() && nums[r] < rb) {
  11.         ++r;
  12.     }
  13.     while (l < nums.size() && nums[l] <= lb) {
  14.         ++l;
  15.     }
  16. }
  17.  
  18. int main() {
  19.     int n, h, m, k;
  20.     cin >> n >> h >> m >> k;
  21.     // m minutes in an hour
  22.     /*
  23.      1 2 4 2
  24.      1 1
  25.  
  26.      0 1 2 3
  27.        1
  28.  
  29.      */
  30.     vector<int> trains(n);
  31.     unordered_map<int, vector<int>> trains_map;
  32.  
  33.     for (int i = 0; i < n; ++i) {
  34.         int hour;
  35.         cin >> hour >> trains[i];
  36.         trains_map[trains[i]].push_back(i);
  37.     }
  38.  
  39.     sort(trains.begin(), trains.end());
  40.     vector<int> mins(3*n);
  41.     for (int i = 0; i < n; ++i) {
  42.         mins[i] = trains[i] - m;
  43.         mins[i + n] = trains[i];
  44.         mins[i + 2*n] = trains[i] + m;
  45.  
  46.         trains_map[trains[i] + m] = trains_map[trains[i] - m] = trains_map[trains[i]];
  47.     }
  48.  
  49.  
  50.     int seg1_l, seg1_r, seg2_l, seg2_r;
  51.     seg1_l = seg1_r = seg2_l = seg2_r = 0;
  52.  
  53.     int time_lb = -k;
  54.     move_window(mins, time_lb, time_lb + k, seg1_l, seg1_r);
  55.     move_window(mins, time_lb + m/2, time_lb + m/2 + k, seg2_l, seg2_r);
  56.  
  57.     int best_time = time_lb + k;
  58.     int best_trains_cnt = seg1_r - seg1_l + seg2_r - seg2_l;
  59.  
  60.     while (true) {
  61.         // shift
  62.         time_lb = mins[seg1_l];
  63.         if (time_lb + k >= m) {
  64.             break;
  65.         }
  66.         move_window(mins, time_lb, time_lb + k, seg1_l, seg1_r);
  67.         move_window(mins, time_lb + m/2, time_lb + m/2 + k, seg2_l, seg2_r);
  68.  
  69.         int cur_trains_cnt = seg1_r - seg1_l + seg2_r - seg2_l;
  70.         int fst_repair_end_time = min(time_lb + k, (time_lb + k + m/2) % m);
  71.         if (cur_trains_cnt < best_trains_cnt || cur_trains_cnt == best_trains_cnt && fst_repair_end_time < best_time) {
  72.             best_time = fst_repair_end_time;
  73.             best_trains_cnt = cur_trains_cnt;
  74.         }
  75.     }
  76.  
  77.     cout << best_trains_cnt << ' ' << best_time << '\n';
  78.  
  79.     best_time -= k;
  80.     vector<int> res;
  81.     for (auto& [time, trains_nums] : trains_map) {
  82.         if ((time > best_time && time < best_time + k) ||
  83.             (time > best_time + m/2 && time < best_time + m/2 + k)) {
  84.             for (int a : trains_nums) {
  85.                 res.push_back(a + 1);
  86.             }
  87.         }
  88.     }
  89.     sort(res.begin(), res.end());
  90.     for (int i = 0; i < res.size(); ++i) {
  91.         if (i != 0) {
  92.             cout << ' ';
  93.         }
  94.         cout << res[i];
  95.         if (i == res.size() - 1) {
  96.             cout << '\n';
  97.         }
  98.     }
  99. }
  100.  
  101. /*
  102. 5 24 8 2
  103. 1 1
  104. 1 0
  105. 1 3
  106. 1 6
  107. 1 7
  108.  
  109. ans:
  110.  1 1
  111.  2
  112.  
  113.  
  114. 5 24 8 4
  115. 1 1
  116. 1 0
  117. 1 3
  118. 1 6
  119. 1 7
  120. ans:
  121.  3 3
  122.  1 2 4
  123.  */
Add Comment
Please, Sign In to add comment