80pts, #9-#11 TLE,其余AC,求优化
  • 板块P9518 queue
  • 楼主Jianbing_Juan
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/22 23:53
  • 上次更新2023/11/3 01:51:49
查看原帖
80pts, #9-#11 TLE,其余AC,求优化
940854
Jianbing_Juan楼主2023/8/22 23:53

评测记录

源代码,注释已写好,但我已经尽力优化了,但是如果leave操作比较多的话就T了,因为这个是O(n)O(n)的。这部分能优化到O(log⁡length)O(\log length)吗?谢谢了。

#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;
        }
    }
}




2023/8/22 23:53
加载中...