Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <vector>
- #include <unordered_map>
- using namespace std;
- // nums[l:r] \in (lb, rb)
- void move_window(const vector<int> &nums, int lb, int rb, int &l, int &r) {
- while (r < nums.size() && nums[r] < rb) {
- ++r;
- }
- while (l < nums.size() && nums[l] <= lb) {
- ++l;
- }
- }
- int main() {
- int n, h, m, k;
- cin >> n >> h >> m >> k;
- // m minutes in an hour
- /*
- 1 2 4 2
- 1 1
- 0 1 2 3
- 1
- */
- vector<int> trains(n);
- unordered_map<int, vector<int>> trains_map;
- for (int i = 0; i < n; ++i) {
- int hour;
- cin >> hour >> trains[i];
- trains_map[trains[i]].push_back(i);
- }
- sort(trains.begin(), trains.end());
- vector<int> mins(3*n);
- for (int i = 0; i < n; ++i) {
- mins[i] = trains[i] - m;
- mins[i + n] = trains[i];
- mins[i + 2*n] = trains[i] + m;
- trains_map[trains[i] + m] = trains_map[trains[i] - m] = trains_map[trains[i]];
- }
- int seg1_l, seg1_r, seg2_l, seg2_r;
- seg1_l = seg1_r = seg2_l = seg2_r = 0;
- int time_lb = -k;
- move_window(mins, time_lb, time_lb + k, seg1_l, seg1_r);
- move_window(mins, time_lb + m/2, time_lb + m/2 + k, seg2_l, seg2_r);
- int best_time = time_lb + k;
- int best_trains_cnt = seg1_r - seg1_l + seg2_r - seg2_l;
- while (true) {
- // shift
- time_lb = mins[seg1_l];
- if (time_lb + k >= m) {
- break;
- }
- move_window(mins, time_lb, time_lb + k, seg1_l, seg1_r);
- move_window(mins, time_lb + m/2, time_lb + m/2 + k, seg2_l, seg2_r);
- int cur_trains_cnt = seg1_r - seg1_l + seg2_r - seg2_l;
- int fst_repair_end_time = min(time_lb + k, (time_lb + k + m/2) % m);
- if (cur_trains_cnt < best_trains_cnt || cur_trains_cnt == best_trains_cnt && fst_repair_end_time < best_time) {
- best_time = fst_repair_end_time;
- best_trains_cnt = cur_trains_cnt;
- }
- }
- cout << best_trains_cnt << ' ' << best_time << '\n';
- best_time -= k;
- vector<int> res;
- for (auto& [time, trains_nums] : trains_map) {
- if ((time > best_time && time < best_time + k) ||
- (time > best_time + m/2 && time < best_time + m/2 + k)) {
- for (int a : trains_nums) {
- res.push_back(a + 1);
- }
- }
- }
- sort(res.begin(), res.end());
- for (int i = 0; i < res.size(); ++i) {
- if (i != 0) {
- cout << ' ';
- }
- cout << res[i];
- if (i == res.size() - 1) {
- cout << '\n';
- }
- }
- }
- /*
- 5 24 8 2
- 1 1
- 1 0
- 1 3
- 1 6
- 1 7
- ans:
- 1 1
- 2
- 5 24 8 4
- 1 1
- 1 0
- 1 3
- 1 6
- 1 7
- ans:
- 3 3
- 1 2 4
- */
Add Comment
Please, Sign In to add comment