80pts仅#5#9WA求调
  • 板块P9518 queue
  • 楼主xiaoyang111
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/6 08:20
  • 上次更新2023/11/2 15:21:43
查看原帖
80pts仅#5#9WA求调
890311
xiaoyang111楼主2023/10/6 08:20

代码:

//xiaoyang111 表示没有 
#include <iostream>
#include <unordered_map>
#define int long long
using namespace std;
signed main(){
	int n;
	cin >> n;
	unordered_map<string,string> l,r;//类似链表 
	unordered_map<string,bool> flag;
	string tail="xiaoyang111",head="xiaoyang111";//空 
	string play1="xiaoyang111",play2="xiaoyang111";//空 
	for (int _=0;_<n;++_){
		string op;
		cin >> op;
		l["xiaoyang111"]="xiaoyang111",r["xiaoyang111"]="xiaoyang111";//空 
		if (op=="start"){
			if (play1!="xiaoyang111"){//可疑
			//放在最后面 
				l[play1]=tail,r[play1]="xiaoyang111";//链 
				r[tail]=play1;//链 
				flag[play1]=true;//记 
				tail=play1;//移 
				if (head=="xiaoyang111"){//如果那个时候队列是空的
					head=play1;//放
				}
				if (play2!="xiaoyang111"){
					l[play2]=tail,r[play2]="xiaoyang111";
					r[tail]=play2;
					flag[play2]=true;
					tail=play2;
				}
			}
			l["xiaoyang111"]="xiaoyang111",r["xiaoyang111"]="xiaoyang111";//空 
			play1=head;
			play2=r[head];
			if (play1=="xiaoyang111"){//如果是空的
				head=tail=play1;//头和尾是空的
				cout<<"Error\n";
				continue;
			}
			cout<<play1<<" ";
			if (play2=="xiaoyang111"){
				head=play2;//因为play1上去了 
				cout<<endl;
				continue;
			}
			head=r[play2];//转移头
			cout<<play2<<endl;
		}else if (op=="arrive"){//可疑
			string x;
			cin >> x;
			if (flag[x] || x==play1 || x==play2){//如果有问题
				cout<<"Error\n";
				continue;
			}
			cout<<"OK\n"; 
			l[x]=tail,r[x]="xiaoyang111";//链上 
			r[tail]=x;//链上 
			tail=x;//移 
			flag[x]=true;//标记 
			if (head=="xiaoyang111"){//如果一个人没有但是加进来了  
				head=x;
				l[head]="xiaoyang111",r[head]="xiaoyang111";
			}
		}else if (op=="leave"){//没问题了
			string x;
			cin >> x;
			if (!flag[x] || x==play1 || x==play2){
				cout<<"Error\n";
				continue;
			}
			cout<<"OK\n";
			flag[x]=false;//标记 
			string left=l[x],right=r[x];//左右 
			if (head==x){//如果把头给删了 
				head=right;
				l[head]="xiaoyang111";
			}
			r[left]=right,l[right]=left;//链 
			if (tail==x){//如果把尾巴给删了 
				tail=left;
				r[tail]="xiaoyang111";
			}
			l[x]="xiaoyang111",r[x]="xiaoyang111";//xiaoyang111 表示空 
		}
	}
	return 0;
}

unordered_map 的 l 表示这个人左边的人是谁,r 表示这个人右边人是谁,字符串 xiaoyang111 表示没有人,变量 head 表示头是谁,tail 是尾巴是谁,同样的,如果队列为空,head 和 tail 均为 xiaoyang111。

2023/10/6 08:20
加载中...