约翰的农场有 n 头奶牛,编号 1∼n。
每天奶牛们都要去食堂用餐。
食堂一共有 k 个座位,也就是说同一时间最多可以容纳 k 头奶牛同时用餐。
已知,第 i 头奶牛到达食堂的具体时刻为 si,用餐所需花费的时间为 ti。
保证 s1<s2<…<sn。
为了让奶牛们有序用餐,约翰制定了如下规则:
- 每头奶牛都必须由约翰安排座位用餐。
- 每头奶牛从到达食堂的那一刻起,即刻进入待安排状态。
- 任意时刻,只要存在空座位以及待安排奶牛,约翰就会即刻安排奶牛就座用餐。
- 如果某一时刻,空座位的数量少于待安排奶牛的数量,则优先安排编号更小的奶牛就座用餐。
- 每头奶牛用餐完毕的那一时刻都会被约翰立即轰走,即刻空出座位。
除了用餐花费时间以外,其它花费时间忽略不计。
请你计算并输出,每头奶牛用餐完毕的具体时刻。
输入格式
第一行包含两个整数 n,k。
接下来 n 行,其中第 i 行包含两个整数 si,ti。
注意,输入保证 s1<s2<…<sn。
输出格式
共 n 行,每行输出一个整数,其中第 i 行的整数表示第 i 头奶牛用餐完毕的具体时刻。
数据范围
前 33 个测试点满足 1≤n≤10。
所有测试点满足 1≤n,k≤5×105,1≤si,ti≤109。输入样例1:
3 2 1 5 2 5 3 5
输出样例1:
6 7 11
输入样例2:
6 1 1 1000000000 2 1000000000 3 1000000000 4 1000000000 5 1000000000 6 3
输出样例2:
1000000001 2000000001 3000000001 4000000001 5000000001 5000000004
奶牛按顺序到达,到达后给每头奶牛安排座位,有空余位置则给奶牛安排,没空位置则奶牛等待,此时等待的奶牛则安排最早结束的位置,如果有多个空位,则可以安排任意位置,我们也安排最早结束的位置,所以直接优先队列模拟餐位,每次从队列中取出最早结束的空位时间,也就是最小值,然后计算该座位吃完饭后的时间,然后再放入队列中。优先队列自动对集合中的数据排序,维护最小值,所以直接通过优先队列模拟
AC code:
#include<bits/stdc++.h> using namespace std; int n, k; int s[500010], t[500010]; priority_queue<long long, vector<long long>, greater<long long>> m; int main() { cin >> n >> k; for (int i = 1; i <= k; i++) m.push(0); while (n--) { long long s, t; cin >> s >> t; long long x = m.top(); m.pop(); x = max(x, s) + t; cout << x << endl; m.push(x); } }