题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4286
题意:模拟容器的插入,删除,移动功能
分析:使用deque,分成三段Lq,Mq,Rq
Sample Input
2 5 1 2 3 4 5 1 5 5 MoveLeft R Insert R 6 Reverse Delete R Insert L 7 5 6536 5207 2609 6604 -4046 1 3 5 Delete L Insert R -9221 Reverse Delete L MoveRight L
Sample Output
7 6 4 3 2 5 2609 5207 6604 -4046
#include <iostream>
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
deque<int> Lq,Mq,Rq;
deque<int>::iterator it;
int rev;
int pop_Back(deque<int>& que)
{
int num = que.back();
que.pop_back();
return num;
}
int pop_Front(deque<int>& que)
{
int num = que.front();
que.pop_front();
return num;
}
void out_print()
{
//unsigned int i;
bool flag = true;
for(it = Lq.begin();it!=Lq.end();it++)
{
if(flag)
{
printf("%d",*it);flag = false;
}
else
printf(" %d",*it);
}
if(rev)
for(it=Mq.end()-1;it!=Mq.begin()-1;it--)
{
if(flag)
{
printf("%d",*it);flag = false;
}
else
printf(" %d",*it);
}
else
for(it=Mq.begin();it!=Mq.end();it++)
{
if(flag)
{
printf("%d",*it);flag = false;
}
else
printf(" %d",*it);
}
for(it=Rq.begin();it!=Rq.end();it++)
{
if(flag)
{
printf("%d",*it);flag = false;
}
else
printf(" %d",*it);
}
printf("\n");
}
int main()
{
int cas;
int sum[500005];
scanf("%d",&cas);
while(cas--)
{
int l,r,i,n,m;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&sum[i]);
}
char ss[10],ss1[10];
int d;
int temp;rev = 0;
scanf("%d%d%d",&l,&r,&n);
Lq.clear();Mq.clear();Rq.clear();
for(i=0;i<l-1;i++) Lq.push_back(sum[i]);
for(;i<r;i++) Mq.push_back(sum[i]);
for(;i<m;i++) Rq.push_back(sum[i]);
while(n--)
{
//out_print();
scanf("%s",ss);
if(ss[0] == 'R')
rev^=1;
else
{
if(ss[0]=='M')
{
scanf("%s",ss1);
if(ss[4]=='L')
{
if(ss1[0] == 'L')
{
temp = pop_Back(Lq);
if(rev)
Mq.push_back(temp);
else
Mq.push_front(temp);
}
else
{
if(rev)
temp = pop_Front(Mq);
else
temp = pop_Back(Mq);
Rq.push_front(temp);
//out_print(
}
}
else
{
if(ss1[0] == 'L')
{
if(rev)
temp = pop_Back(Mq);
else
temp = pop_Front(Mq);
Lq.push_back(temp);
}
else
{
temp = pop_Front(Rq);
if(rev)
Mq.push_front(temp);
else
Mq.push_back(temp);
}
}
}
else if(ss[0] == 'D')
{
scanf("%s",ss1);
if(ss1[0]=='L')
{
if(rev)
Mq.pop_back();
else
Mq.pop_front();
}
else
{
if(rev)
Mq.pop_front();
else
Mq.pop_back();
}
}
else if(ss[0] == 'I')
{
scanf("%s%d",ss1,&d);
if(ss1[0]=='L')
{
if(rev)
Mq.push_back(d);
else
Mq.push_front(d);
}
else
{
if(rev)
Mq.push_front(d);
else
Mq.push_back(d);
}
}
}
}
out_print();
}
return 0;
}