题目链接: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;
}