1 条题解
-
1
最短题解有没有? 乍看是人畜无害的队列练习题。 但按题意简单模拟,编译器将友好赠送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
- 上传者