1 条题解

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

    最短题解有没有? 乍看是人畜无害的队列练习题。 但按题意简单模拟,编译器将友好赠送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
    标签
    递交数
    35
    已通过
    12
    上传者