class Solution {
private:
typedef pair<int, int> PII;
typedef long long LL;
public:
vector<int> getOrder(vector<vector<int>>& tasks) {
int len = tasks.size();
vector<int> index(len);
iota(index.begin(), index.end(), 0); // 构建 0...len 的索引
sort(index.begin(), index.end(), [&](int i, int j){ // 按照加入时间对索引排序
return tasks[i][0] < tasks[j][0];
});
vector<int> res;
priority_queue<PII, vector<PII>, greater<PII>> q;
LL cur = 0;
int ptr = 0;
for(int i = 0; i < len; i++){
if(q.empty())
cur = max(cur, (LL)tasks[index[ptr]][0]); //必须转成LL才能进行比较
while(ptr < len && tasks[index[ptr]][0] <= cur){ // 找到当前时间avaliable的任务,按照持续时间小到大的顺序入队
q.push({tasks[index[ptr]][1], index[ptr]});
ptr ++;
}
auto&& [elaps, ind] = q.top();
cur += elaps; // 这里可能会爆int,故设成 long long
res.push_back(ind);
q.pop();
}
return res;
}
};