hoangi19
Senior Member
C++:
class Solution {
struct LeavingNode {
int i;
int arrival;
int leaving;
int order;
LeavingNode(int _i, int _arrival, int _leaving, int _order) {
i = _i;
arrival = _arrival;
leaving = _leaving;
order = _order;
}
};
class Compare
{
public:
bool operator() (LeavingNode x, LeavingNode y){
return x.leaving > y.leaving;
}
};
public:
int smallestChair(vector<vector<int>>& times, int targetFriend) {
priority_queue<LeavingNode, std::vector<LeavingNode>, Compare> pq_leave;
priority_queue<int, vector<int>, greater<int>> pq_order;
int n = times.size();
int ids[n];
for (int i = 0; i < n; ++i) ids[i] = i;
sort(ids, ids + n, [×](int i, int j) { return times[i][0] < times[j][0]; });
// for (int i : ids) cout << i << "\n";
for (int i = 0; i < n; ++i){
pq_order.push(i);
}
for (int i : ids) {
// LeavingNode cur(i, times[i][0], times[i][1], )
int cur_arrival = times[i][0];
while (!pq_leave.empty()){
auto top = pq_leave.top();
// cout << top.i << " [" << top.arrival << "," << top.leaving << "] " << top.order << " x\n";
if (top.leaving > cur_arrival) break;
pq_order.push(top.order);
pq_leave.pop();
}
int order = pq_order.top();
pq_order.pop();
if (i == targetFriend) return order;
LeavingNode cur(i, cur_arrival, times[i][1], order);
pq_leave.push(cur);
// cout << i << " [" << cur_arrival << "," << times[i][1] << "] " << order << "\n";
}
return -1;
}
};

