关于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;
}