【心得】:
刚开始写的时候,构造了一个双链表,自以为写的不错,但,,只过了两个测试数据,其他都是TLE,于是看题解,原来是自己在插入元素的时候,总是需要遍历一遍列表来寻找插入位置,花费了大量时间,看题解才懂得记录每个元素位置的做法,于是写了很多种做法(在题解的帮助下各种做法全部AC),但还是想练练STL的list,学会了很多东西,于是写此文章记录一下
【代码】:
#include <bits/stdc++.h>
using namespace std;
list<int> qe;
list<int>::iterator pos[100005];//记录每个元素的迭代器
bool vis[100005] = {0};
int main ()
{
int n,k,p,m,x;
scanf("%d",&n);
pos[1] = qe.insert(qe.begin(),1);//insert返回插入位置的迭代器
for(int i=2;i<=n;i++)
{
scanf("%d %d",&k,&p);
if(p==0) pos[i] = qe.insert(pos[k],i);
else pos[i] = qe.insert(next(pos[k]),i);//next函数返回下一个迭代器
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&x);
if(!vis[x])
{
vis[x] = true;
qe.erase(pos[x]);//链表的删除函数需要的参数是删除元素的迭代器
}
}
int first = 1;
for(int i:qe)
{
first==1 ? first=0 : putchar(' ');
printf("%d",i);
}
return 0;
}
【经验】:
1、list的remove函数比erase函数要慢很多,这道题用remove会获得TLE,remove的参数是删除元素,erase的参数是删除元素的迭代器。
2、insert返回插入位置的迭代器。
3、next函数返回下一个迭代器。
【题目链接】: