class Solution {
public:
struct Task {
int id;
long start_time;
int duration;
};
struct cmp_by_start_time {
bool operator() (Task &a, Task &b) {
return a.start_time > b.start_time;
}
};
struct cmp_by_duration_id {
bool operator() (Task &a, Task &b) {
return a.duration != b.duration ? a.duration > b.duration : a.id > b.id;
}
};
vector<int> getOrder(vector<vector<int>>& tasks) {
priority_queue<Task, vector<Task>, cmp_by_start_time> candidate_tasks;
priority_queue<Task, vector<Task>, cmp_by_duration_id> ready_tasks;
for(int i = 0; i < tasks.size(); i ++)
candidate_tasks.push(Task{i, tasks[i][0], tasks[i][1]});
long cur_time = 0;
vector<int> res;
while(res.size() < tasks.size()) {
if(ready_tasks.empty())
cur_time = max(cur_time, candidate_tasks.top().start_time);
while(!candidate_tasks.empty() && candidate_tasks.top().start_time <= cur_time) {
ready_tasks.push(candidate_tasks.top());
candidate_tasks.pop();
}
Task task_to_process = ready_tasks.top();
ready_tasks.pop();
res.push_back(task_to_process.id);
cur_time += task_to_process.duration;
}
return res;
}
};