B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
deque真的秀,queue和stack。。。没啥用了啊。操作差不多,就是在前面加一个front||back_就行了。
题干:
题目描述
题目描述
约翰的N只奶牛(编为1到N号)正在直线上排队.直线上开始的时候一只牛也没有.接下来发生了S(1≤S≤100000)次事件,一次事件可能是以下四种情况之一:
.一只奶牛加入队伍的左边(输入“AL”).
.一只奶牛加入队伍的右边(输入“AR”).
·K只队伍左边奶牛离开(输入“DLK”).
·K只队伍右边奶牛离开(输入“DRK”).
请求出最后的队伍是什么样.
数据保证离开的奶牛不会超过队伍里的奶牛数,最后的队伍不空
输入格式
第1行输入S,之后S行每行描述一次事件,格式如题目描述所示
输出格式
由左到右输出队伍最后的情况.
样例输入
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<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<deque> #include<cstring> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1e9 + 7; typedef long long ll; typedef double db; template <class T> void read(T &x) { char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x; } template <class T> void write(T x) { if(x < 0) putchar('-'), x = -x; if(x >= 10) write(x / 10); putchar('0' + x % 10); } deque <int> de; char s[10]; int num = 0; int main() { int n; read(n); duke(i,1,n) { scanf("%s",s); if(s[0] == 'A') { scanf("%s",s); if(s[0] == 'L') de.push_front(++num); else de.push_back(++num); } else { int x; scanf("%s",s); read(x); if(s[0] == 'L') { while(x != 0) { // cout<<de.front()<<endl; de.pop_front(); x--; } } else { while(x != 0) { // cout<<de.back()<<endl; de.pop_back(); x--; } } } } while(!de.empty()) { printf("%d\n",de.front()); de.pop_front(); } return 0; }
只想找一个不会伤害我的人