[NOIP-P0512]列队

题目描述

在玩完“捉迷藏”游戏后,Anna的N个朋友(编号为1..N)开始排队,队列刚开始时没有一个人,随着时间的进展,一个朋友接一个朋友地从队列的左端或右端加入到队列。每隔一段时间,一些朋友又从队列的左端或右端离开去吃他们自己带来的点心或饮料。
令Anna伤脑筋的是,她没有办法跟踪这些牛在队列中的轨迹,请你编写程序帮助她。
Anna的朋友们加入队列时是从1到N的顺序,一旦一个朋友离开的队列,他(她)就不会再回到队列。给你S (1 <= S <= 100,000)行输入描述,每行描述有两种类型:
    * A 表示一个朋友某端进入队列
    * K 表示有K个朋友从队列某端离开队列
在所有输入行结束后,你的程序要输出最后队列中从左到右所有朋友的编号。输入的最后一行保证不是空行。

输入

第1行:一个整数S
第2行至S+1行:i+1行包含一行描述I,格式是以下四种情况之一: 
    * A L -- 一个朋友从队列的左边加入队列
    * A R --一个朋友从队列的右边加入队列
    * D L K – K个朋友从队列左端离开队列
    * D R K -- K个朋友从队列右端离开队列

输出

从左到右输出最后队列中剩下的朋友的编号,每行一个编号。

样例输入

10
A L
A L
A R
A L
D R 2
A R
A R
D L 1
A L
A R

样例输出

7
2
5
6
8

提示

代码

#include<bits/stdc++.h>
using namespace std;
int s;
char tmp[10];
int cnt=0;
int q[200011],l,r;
int main()
{
    cin>>s;
    gets(tmp);
    l=100001,r=100000;
    for(int i=1;i<=s;i++)
    {
        char type,x;
        scanf("%c %c",&type, &x);
        if(type=='A')
        {
            cnt++;
            if(x=='L') q[--l]=cnt;
            else q[++r]=cnt;
        }
        else
        {
            int num;
            scanf("%d",&num);
            if(x=='L') l+=num;
            else r-=num;
        }
        gets(tmp);
    }
    for(int i=l;i<=r;i++) printf("%d\n",q[i]);
    return 0;
}
posted @ 2020-03-21 11:52  牛大了的牛大  阅读(287)  评论(0编辑  收藏  举报