题目 : Click
直接用 list 模拟就好了。分成三段,left, 中间Q ,right,
翻转的时候,颠倒下插入的位置就结束了。
#include <cstdio>
#include <cstdlib>
#include <list>
#include <stack>
using namespace std;
int n;
int l,r;
char s[100];
int main(){
int t;
scanf("%d",&t);
while(t--){
list<int> Q,left,right;
scanf("%d",&n);
int rev = 0;
for(int i=0,v;i<n;i++){
scanf("%d",&v);
Q.push_back(v);
}
int l,r;
scanf("%d %d",&l,&r);
for(int i=1;i<l;i++){
left.push_back(Q.front());
Q.pop_front();
}
for(int j=n;j > r;j--){
right.push_front(Q.back());
Q.pop_back();
}
int m;
scanf("%d",&m);
int val;
while(m--){
scanf("%s",s);
if(strcmp(s,"MoveLeft") == 0){
scanf("%s",s);
if(s[0] == 'L'){
val = left.back();
left.pop_back();
if(!rev){
Q.push_front(val);
}else{
Q.push_back(val);
}
}else{
if(!rev){
val = Q.back();
Q.pop_back();
}else{
val = Q.front();
Q.pop_front();
}right.push_front(val);
}
}else if(strcmp(s,"MoveRight") == 0){
scanf("%s",s);
if(s[0] == 'L'){
if(!rev){
val = Q.front();
Q.pop_front();
}else{
val = Q.back();
Q.pop_back();
}left.push_back(val);
}else{
val = right.front();
right.pop_front();
if(!rev){
Q.push_back(val);
}else{
Q.push_front(val);
}
}
}else if(strcmp(s,"Insert") == 0){
scanf("%s",s);
scanf("%d",&val);
if(s[0]=='L'){
if(!rev){
Q.push_front(val);
}else{
Q.push_back(val);
}
}else{
if(!rev){
Q.push_back(val);
}else{
Q.push_front(val);
}
}
}else if(strcmp(s,"Reverse") == 0){
rev ^= 1;
}else if(strcmp(s,"Delete") == 0){
scanf("%s",s);
if(s[0]=='L'){
if(!rev){
Q.pop_front();
}else{
Q.pop_back();
}
}else{
if(!rev){
Q.pop_back();
}else{
Q.pop_front();
}
}
}else{
while(1);
}
}
bool flag=true;
while(!left.empty()){
if(flag){
flag = false;
printf("%d",left.front());
}else{
printf(" %d",left.front());
}
left.pop_front();
}
while(!Q.empty()){
if(!rev){
if(flag){
flag = false;
printf("%d",Q.front());
}else{
printf(" %d",Q.front());
}
Q.pop_front();
}else{
if(flag){
flag = false;
printf("%d",Q.back());
}else{
printf(" %d",Q.back());
}
Q.pop_back();
}
}
while(!right.empty()){
if(flag){
flag = false;
printf("%d",right.front());
}else{
printf(" %d",right.front());
}
right.pop_front();
}
printf("\n");
}
return 0;
}