关于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 @   Jijidawang  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示