★ 输入文件:cline.in
输出文件:cline.out
简单对比
时间限制:1 s 内存限制:128 MB
农夫约翰有N头牛,编号依次为1~N,他正在把这些牛排成一队,队伍中开始是没有牛的,随着时间推移,牛儿一个一个地从左端或右端加入到队伍中来。令人烦心的是,随时会有一些牛从左端或右端离开队伍溜向草场。
FJ正费劲地给牛排队,请你帮帮他。
奶牛按1~N的顺序入队,牛一旦离队就再也不会回来了,你的程序将处理给定的S(1 <= S <= 100,000)个输入指令,每一个指令占一行,指令有两种类型:
*一头牛入队(带有一个参数,代表从左端入队还是右端入队)
*K头牛从左端或右端离队(提供的参数包括离队牛数及是从哪端离队)
输入指令中没有提到的操作则不会被执行。
当所有的输入指令都执行完毕后,你的程序必须要按从左到右的顺序输出队伍中牛的编号,最后的队伍保证不为空。
输入格式:
第1行:一个整数S;
第2~S+1行:第i+1行写着一个指令,指令有4种格式:
*A L ——表示有一头牛从左端入队;
*A R ——表示有一头牛从右端入队;
*D L K ——表示有K头牛从队伍左端离队;
*D R K ——表示有K头牛从队伍右端离队;
输出格式:
第1~??行:按从左到右的顺序输出队伍中牛的编号,一个数一行。
输入输出样例:
cline.in
10
A L
A L
A R
A L
D R 2
A R
A R
D L 1
A L
A R
cline.out
7
2
5
6
8
输出样例解释:
指令 执行完指令后牛的队伍
A L 1
A L 2 1
A R 2 1 3
A L 4 2 1 3
D R 2 4 2
A R 4 2 5
A R 4 2 5 6
D L 1 2 5 6
A L 7 2 5 6
A R 7 2 5 6 8
//初始设一个很大的数,从中间向两边扩展 #include<iostream> #include<cstdio> #define N 100010 using namespace std; int q; int f[N]={0}; void work() { int i,j,k,l,r,num,tot=0,L; char op,ha; l=50000; r=49999; cin>>q; for(i=1;i<=q;i++) { cin>>op; if(op=='A') { cin>>ha; tot++; if(ha=='R')f[++r]=tot; if(ha=='L')f[--l]=tot; } else { cin>>ha>>num; L=r-l+1; if(num>=L)l=r; else { if(ha=='L')l+=num; else r-=num; } } } for(k=l;k<=r;k++)cout<<f[k]<<endl; } int main() { freopen("cline.in","r",stdin); freopen("cline.out","w",stdout); work(); return 0; }