洛谷—数据结构1-1线性表 队列安排

【心得】:

刚开始写的时候,构造了一个双链表,自以为写的不错,但,,只过了两个测试数据,其他都是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函数返回下一个迭代器。

【题目链接】:

队列安排 - 洛谷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值