时间限制:2 秒 / 内存限制:1024 MiB

得分: 400 分

《A - 回文数》《A - 回文数》《A - 回文数》

问题描述

有一家餐厅最多可以同时容纳 K 名顾客。在这家餐厅前有一条侧街,那里有一个排队系统。

在时间 0 时,餐厅内没有顾客,队列为空。

今天,有 N 组顾客计划到来,他们按到达顺序编号从 1 到 N 。第 i 组有 Ci​ 人,在时间 Ai​ 加入队伍的末尾,并在进入后经过 Bi​ 时间单位离开餐厅。

每一组顾客在同时满足以下两个条件时,最早离开队列进入餐厅:

  • 该组位于队列的最前面。换句话说,在那一刻仍然在队列中的组中,该组是最早加入的。
  • 当将该组的人数与当前在餐厅中的所有组的人数相加时(包括正好在该时刻进入的人数,不包括离开的人数),总人数为 K 或更少。

找出每个组进入餐厅的时间。

《A - 回文数》《A - 回文数》《A - 回文数》

约束条件

  • 1≤N≤3×105
  • 1≤K≤107
  • 1≤Ai​,Bi​≤107 (1≤iN)
  • A1​<⋯<AN
  • 1≤Ci​≤K (1≤iN)
  • 所有输入值都是整数。

《A - 回文数》《A - 回文数》《A - 回文数》

输入

输入从标准输入中按以下格式给出:

N K
A1​ B1​ C1​
⋮
ANBNCN
《A - 回文数》《A - 回文数》《A - 回文数》

输出

输出 N 行。第 i 行( 1≤iN )应包含组 i 进入餐厅的时间,以整数形式表示。


《A - 回文数》《A - 回文数》《A - 回文数》

示例输入 1 复制

复制
4 10
30 300 3
60 45 4
90 45 5
120 45 2
《A - 回文数》《A - 回文数》《A - 回文数》

示例输出 1 复制

复制
30
60
105
120

每组进出流程如下:

  • 在时间 30 时,小组 1 加入队列并立即进入,使餐厅中的顾客数量为 3 。
  • 在时间 60 时,小组 2 加入队列并立即进入,使餐厅中的顾客数量为 7 。
  • 在时间 90 时,小组 3 加入队列。
  • 在时间 105 时,小组 2 离开,使餐厅中的顾客数量变为 3 。紧接着,小组 3 进入,使餐厅中的顾客数量变为 8 。
  • 在时间 120 时,小组 4 加入队列并立即进入,使餐厅中的顾客数量变为 10 。
  • 在时间 150 时,小组 3 离开,使餐厅中的顾客数量变为 5 。
  • 在时间 165 时,小组 4 离开,使餐厅中的顾客数量变为 3 。
  • 在时间 330 时,小组 1 离开,使得餐厅中的顾客数量为 0 。

《A - 回文数》《A - 回文数》《A - 回文数》

样本输入 2 复制

复制
4 10
30 300 10
60 45 2
90 45 3
120 45 4
《A - 回文数》《A - 回文数》《A - 回文数》

样本输出 2 复制

复制
30
330
330
330

每个小组的进入和离开按以下方式进行:

  • 在时间 30 时,小组 1 加入队列并立即进入,使得餐厅中的顾客数量为 10 。
  • 在时间 60 时,小组 2 加入队列。
  • 在时间 90 时,组 3 加入队列。
  • 在时间 120 时,组 4 加入队列。
  • 在时间 330 时,组 1 离开,使餐厅中的顾客数量为 0 。紧接着,组 2,3,4 进入,使餐厅中的顾客数量为 9 。
  • 在时间 375 时,组 2,3,4 离开,使餐厅中的顾客数量为 0 。

《A - 回文数》《A - 回文数》《A - 回文数》

示例输入 3Copy

复制
10 24
279290 9485601 1
1094410 8022270 4
1314176 7214745 5
1897674 5924694 10
1921802 5769841 4
2506394 2765234 2
2558629 2727489 9
2681289 4061363 5
3022540 2291905 3
4407692 1313036 8
《A - 回文数》《A - 回文数》《A - 回文数》

Sample Output 3

复制
279290
1094410
1314176
1897674
1921802
7691643
7822368
8528921
8528921
10549857

思路

注意到必定有序,所以将所有人加入堆,每次若不满足,则删堆顶直到满足。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[300005],b[300005],c[300005],lk=0,kl=0;
struct one{
	long long a,b,c,d;
}aa[300005];
priority_queue<one> q;
bool operator<(one a1,one b1){
	return a1.d>b1.d;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i]>>c[i];
		aa[i].a=a[i];
		aa[i].b=b[i];
		aa[i].c=c[i];
	} 
	lk=0;
	for(int i=1;i<=n;i++){
		while(lk+c[i]>=k+1){
			kl=max(kl,q.top().d);
			lk-=q.top().c;
			q.pop();
		}
		q.push({0,0,c[i],max(a[i],kl)+b[i]});
		lk+=c[i]; 
		cout<<max(a[i],kl)<<endl;
	}
	return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐