2 条题解

  • 1
    @ 2024-3-12 22:13:59

    最短题解有没有?

    • 0
      @ 2024-5-26 22:15:02

      最短题解有没有? 乍看是人畜无害的队列练习题。 但按题意简单模拟,编译器将友好赠送TLE错误3连。

      即“在k号同学的边上插入i号同学”的操作,如果枚举查找去定位k号同学的位置,速度太慢。 所以,在插入i号同学之前,必须记录前面i-1个同学在队列中的位置以便一键定位。

      比起int数组来记录位置,最聪明的办法是使用迭代器数组,迭代器可直接用于之后的插入操作, 代码短美,不信体会下整个解法的灵魂:这个赋值语句完成了3件事 :

      //找到k号同学,将i号同学插入其左侧,然后记录i号同学的位置
      pos[i]=vec.insert(pos[k],i);
      

      删除的操作和插入类似,所以代码量差不多。但如果想偷懒,硬凑一行代码就可解决。 (在工程编码中很常用的办法:无效的数据项打上标记,在后续处理中跳过。毕竟工程编码很忌讳物理删除数据)

      #include<bits/stdc++.h>
      using namespace std;
      #define Itr list<int>::iterator
      Itr pos[100005];
      int main(){
          list<int> vec; int n,k,p;
          cin>>n;
          vec.push_back(1); 
          pos[1]=vec.begin();
          for (int i=2;i<=n;i++){
              cin>>k>>p;
              Itr ii=pos[k];
              if (p) ii=next(ii);
              pos[i]=vec.insert(ii,i);
          }
          cin>>n;
          for (int i=0;i<n;i++){cin>>k; *pos[k]=0;}
          for (int i:vec) if (i) cout<<i<<' ';
          return 0;
      }
      
      
      
      • 1

      信息

      ID
      161
      时间
      1000ms
      内存
      125MiB
      难度
      3
      标签
      递交数
      36
      已通过
      12
      上传者