洛谷P1160 队列安排--c++ STL

 

#include <iostream>
#include<list>
using namespace std;

const int maxN = 1e5 ;//这个常量的定义要写在main函数外,写在main函数里面会造成栈溢出异常

//每个人按编号顺序储存迭代器在数组里
list<int>::iterator pos[maxN];

//是否被修改数组,按编号顺序
bool erased[maxN];

//实际队列链表
list<int> queList;

//最大人数
int N;
int main() {
	
    //第一个人入队
    queList.push_front(1);
    pos[1] = queList.begin();

    cin >> N;
    for (int i = 2; i <= N; i++)
    {
        int k, p;
        cin >> k >> p;
        if (p == 0)
        {
            pos[i] = queList.insert(pos[k], i); //第i个人站在k的左边
        }
        else
        {
            //insert是插入作为参数的迭代器的前面
            //所以插入到后面的话,要先定义下一个迭代器
            list<int>::iterator nextIter = next(pos[k]);
            pos[i] = queList.insert(nextIter, i);  //第i个人站在k的右边边
        }
    }

    //删除人数
    int M;
    cin >> M;

    for (int x,i = 1; i <= M; i++) {
        cin >> x;
        //第x人是否被删除过
        if (!erased[x]) {
            queList.erase(pos[x]);
        }
        erased[x] = true;
    }

    //遍历输出
    for (int x : queList) {
        cout << x << " ";
    }
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值