Cho danh sách yêu cầu requests[i] = [t, d], trong đó t là thời điểm đến, d là hướng: 1 (vào) hoặc 0 (ra). Cửa chỉ cho một người qua mỗi đơn vị thời gian, bắt đầu ở trạng thái "vào". Các quy tắc:
- Cửa lấy hướng của người cuối cùng sử dụng.
- Nếu chỉ một người chờ tại thời điểm
t, người đó qua cửa. - Nếu nhiều người muốn cùng hướng, người đến sớm hơn ưu tiên; nếu hướng khác nhau, hướng trước đó ưu tiên.
- Nếu cửa không ai dùng trong 1 đơn vị thời gian, quay về trạng thái "vào".
Cần trả về danh sách [t, d] của những người thực sự qua cửa.
Ví dụ: [[2,0],[3,1],[6,0],[6,1],[3,0]] → [[2,0],[3,0],[4,1],[6,1],[7,0]].
Ví dụ
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<int>> v) {
cout << "[";
for (int i = 0; i < v.size(); i++) {
cout << "[";
for (int j = 0; j < v[i].size(); j++)
cout << v[i][j] << ", ";
cout << "],";
}
cout << "]" << endl;
}
class Solution {
public:
vector<vector<int>> solve(vector<vector<int>>& v) {
sort(v.begin(), v.end());
vector<vector<int>> ret;
int curr = 1, i = 0, j = 0, n = v.size();
while (i < n) {
if (!ret.empty() && v[i][0] - ret.back()[0] > 1)
curr = 1;
j = i + 1;
vector<int> arr(2);
arr[v[i][1]]++;
while (j < n && v[j][0] == v[i][0]) {
arr[v[j][1]]++;
j++;
}
int t = max(ret.empty() ? 0 : ret.back()[0] + 1, v[i][0]);
if (arr[1] && arr[0]) {
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
curr ^= 1;
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
} else {
curr = v[i][1];
while (arr[curr]--) {
ret.push_back({t, curr});
t++;
}
}
curr = ret.back()[1];
i = j;
}
return ret;
}
};
int main() {
vector<vector<int>> v = {{2,0},{3,1},{6,0},{6,1},{3,0}};
Solution ob;
print_vector(ob.solve(v));
}
Đầu vào
{{2,0},{3,1},{6,0},{6,1},{3,0}}
Đầu ra
[[2,0,],[3,0,],[4,1,],[6,1,],[7,0,],]