【悬赏 3 RMB】30pts有注释求条
  • 板块P9518 queue
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/22 21:49
  • 上次更新2024/7/23 00:13:43
查看原帖
【悬赏 3 RMB】30pts有注释求条
1198296
封禁用户楼主2024/7/22 21:49
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
deque<string> dq;//队列
set<string> st;//储存当前队列中的人数
void change(){
    while(dq.size()&&st.find(dq.front())==st.end()) dq.pop_front();//把已经删除过的人去掉
    if(!dq.size()) return ;
	dq.push_back(dq.front());
	dq.pop_front();
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,qwq=0;//qwq->上一次在机厅玩DX的人数
	string s,x;
	cin>>n;
	while(n--){
		cin>>s;
		if(s=="start"){
			while(dq.size()&&st.find(dq.front())==st.end()) dq.pop_front();//把已经删除过的人去掉
			if(dq.size()) for(int i=1;i<=qwq;++i) change();//把正在玩的人放到队尾
			while(dq.size()&&st.find(dq.front())==st.end()) dq.pop_front();//把已经删除过的人去掉
			if(dq.empty()) cout<<"Error"<<endl;//队列为空
			else if(dq.size()==1){//一个人
				cout<<dq.front()<<endl;
				qwq=1;
			}
			else{//大于等于两个人
				if(st.find(dq[1])!=st.end()) cout<<dq[0]<<' '<<dq[1]<<endl;//队列中“所谓”的第二个人没被删除
				else cout<<dq[0]<<' '<<dq[2]<<endl;//队列中“所谓”的第二个人被删除
				qwq=2;
			}
		}
		else if(s=="arrive"){
			cin>>x;
			if(st.find(x)!=st.end()) cout<<"Error"<<endl;//队列中已经有这个人
			else{//队列中没有这个人
				st.insert(x);//插入
				dq.push_back(x);//插入队尾
				cout<<"OK"<<endl;
			}
		}
		else{
			cin>>x;
			while(st.find(dq.front())==st.end()) dq.pop_front();//把已经删除过的人去掉
			if(st.empty()) cout<<"Error"<<endl;
			if(st.find(x)==st.end()||dq[0]==x) cout<<"Error"<<endl;//队列中没有这个人\这个人在玩DX
			//这个人在玩DX:队列中“所谓”的第二个人没被删除\队列中“所谓”的第二个人被删除
			if((st.find(dq[1])==st.end()&&dq[2]==x)||(st.find(dq[1])!=st.end()&&dq[1]==x)) cout<<"Error"<<endl;
			else{
				st.erase(x);//删掉这个人
				cout<<"OK"<<endl;
			}
		}
	}
	return 0;
}
2024/7/22 21:49
加载中...