源代码,注释已写好,但我已经尽力优化了,但是如果leave操作比较多的话就T了,因为这个是O(n)的。这部分能优化到O(loglength)吗?谢谢了。
#include <iostream>
#include <deque>
#include <set>
#include <string>
using namespace std;
/*
void out_deque(deque<string> a)
{
deque<string>b=a;
while(!b.empty())
{
cout<<b.front()<<".";
b.pop_front();
}
cout<<endl;
}
*/
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,p=0;
deque<string> q;
set<string> s;
string name,opt,playing[2];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>opt;
if(opt=="start")
{
for(int i=0;i<p;i++)
{
q.push_back(playing[i]);
q.pop_front();//上轮玩家回队尾
}
if(q.size()==0)
{
cout<<"Error"<<endl;//无人
}
else if(q.size()==1)//一人
{
p=1;
cout<<q.front()<<endl;
playing[0]=q.front();
}
else
{
p=2;
string a=q.front();//多人,deque O(1)获取前两名
q.pop_front();
cout<<a<<' '<<q.front()<<endl;
playing[0]=a;
playing[1]=q.front();
q.push_front(a);
}
}
else if(opt=="leave")
{
cin>>name;
int flag=0;
for(int i=0;i<p;i++)
{
if(playing[i]==name)//是否在玩
{
cout<<"Error"<<endl;
flag=1;
}
}
if(flag)continue;
if(s.find(name)==s.end())//是否在队中
{
cout<<"Error"<<endl;
continue;
}
s.erase(name);
cout<<"OK"<<endl;
for(int i=q.size();i>0;i--)
{
if(q.front()==name)q.pop_front();//O(n)清除
else
{
q.push_back(q.front());
q.pop_front();
}
}
}
else if(opt=="arrive")
{
cin>>name;
if(s.find(name)!=s.end())
{
cout<<"Error"<<endl;
continue;
}
s.insert(name);//加到队尾
q.push_back(name);
cout<<"OK"<<endl;
}
}
}