关于P1160 队列安排

队列模板题,容易出各种玄学错误


这题需要用到的$STL$芝士:

  • list<int> l:建立一个元素为int的链表
  • l.push_back(n):在l的末尾加入n

设it为list的迭代器

  • next(it):it后面的迭代器
  • l.insert(it,n):在it前面加入n,返回插入的新元素的位置
  • l.erase(it):删除it位置的元素

code:

#include <iostream>
#include <list>
using namespace std;
list<int> l;int n, m, k, p, x;list<int>::iterator s[100001];bool f[100001]; //s[i]为i号同学的位置,f[i]表示第i个同学有没有被erase过
int main()
{
    l.push_back(1); //开始时只有1号
    cin >> n;s[1] = l.begin(); //1号同学在队首
    for(int i = 2;i <= n;++i)
    {
        cin >> k >> p;
        if(p) s[i] = l.insert(next(s[k]), i); //第k个同学右边的同学的左边,即第k个同学的右边
        else s[i] = l.insert(s[k], i); //第k个同学的左边
    }
    cin >> m;
    for(int i = 0;i < m;++i)
    {
        cin >> x;
        if(!f[x]) l.erase(s[x]); //第i个同学还在,erase出去
        f[x] = 1; //标记
    }
    for(int it : l) //这个for的意思是对于l中每一项
        cout << it << " ";
    return 0;
}
posted @ 2021-07-14 15:51  5k_sync_closer  阅读(1)  评论(0编辑  收藏  举报  来源