医疗队列 (单调队列)

文章讲述了如何通过编程实现医疗队列管理,涉及命令处理、公民调度和快速响应,以求高效服务公民。
摘要由CSDN通过智能技术生成

 题目链接:https://acm.ecnu.edu.cn/contest/297/problem/1020/

Cuber QQ 被分配了一个重要的任务,他要帮助医院协调医疗队列。

等待就诊的每个公民都将被分配一个唯一的数字,从 1 到  P (这里的 P  是当前的人口)。它们将被放入一个队列, 1 在 2 前面, 2 在 3 前面,以此类推。医院将从这个队列中逐一处理病人。一旦其中一个公民被服务,他们会立即从队伍的前面移到后面。

当然,有时会出现紧急情况——如果一个公民刚刚被一个蒸汽压路机碾过,你不能等到数十个公民去做常规检查后再接受治疗!因此,对于这些(希望是罕见的)情况,可以使用一个快速命令将一个人移到队列的前面。其他国家的相对秩序将保持不变。

给定处理命令和快速命令的顺序,输出当前服务的公民的编号。

输入格式

第一行两个数m,p,表示命令个数和公民个数。

接下来n行,每行为一个命令:

  • 1:表示当前队列首部的公民被服务,被服务后自动放到队列末位。
  • 2 x:表示将编号为x的公民移动到队列首部(不进行服务操作)。
  • 3:询问当前队列首部的公民的编号(即下一个要被服务的公民编号)。

输出格式

对于每个3命令,输出一个数表示当前队列首部的公民的编号。

样例

input

10 5
2 1
3
2 5
3
1
1
1
3
1
3

output

1
5
3
4

思想:队列

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 2e6+5;
const int inf = 0x3f3f3f3f;

struct node{
	int num,ver;
};

int n,p;
int v[N];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin>>n>>p;
	deque<node>q;
	for(int i=1;i<=p;++i){
		q.push_back({i,1});
		v[i]=1;
	}
	while(n--){
		int opt; 
		cin>>opt;
		if(opt==1){
			node u;
			do{
				u=q.front(); 
				q.pop_front(); 
			}
			while(u.ver!=v[u.num]);
			q.push_back(u);
		} 
		else if(opt==2){
			int x;
			cin>>x;
			v[x]++;
			q.push_front({x,v[x]});
		} 
		else {
			node u;
			do{
				u=q.front(); 
				q.pop_front();
			}
			while(u.ver!=v[u.num]);
			cout<<u.num<<"\n";
			q.push_front(u);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值