题目描述
解题思路
有一段区间和 两个指针(L 和 R)
要求支持下列操作:
1) 指针左移
2) 指针右移
3) 在指针所指位置插入一个数
4) 删除指针所指位置上的数
5) 反转 指针L 和 R 形成的区间
可以将区间分成三段( [0, L) [L, R] (R, n] )考虑, 对每个区间用一个双端队列来维护.
对于反转操作,如果每次真的去反转的话,肯定会TLE的,所以拿个flag来标记此时双端队列的头尾位置是不是相反.
参考代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
using namespace std;
const int MAX_N = 1000010;
int v[MAX_N], l1, l2, l3;
deque<int> ql, qm, qr;
char opr[10];
bool flag;
void Init(){
l1 = l2 = l3 = 0;
flag = true;
ql.clear();
qm.clear();
qr.clear();
}
void MoveLeft(char c){
if (c == 'L'){
if (flag) qm.push_front(ql[l1-1]);
else qm.push_back(ql[l1-1]);
ql.pop_back();
l2++; l1--;
}
else{
if (flag){
qr.push_front(qm[l2-1]);
qm.pop_back();
}else{
qr.push_front(qm[0]);
qm.pop_front();
}
l2--; l3++;
}
}
void MoveRight(char c){
if (c == 'L'){
if (flag){
ql.push_back(qm[0]);
qm.pop_front();
}else{
ql.push_back(qm[l2-1]);
qm.pop_back();
}
l1++; l2--;
}else {
if (flag) qm.push_back(qr[0]);
else qm.push_front(qr[0]);
qr.pop_front();
l2++; l3--;
}
}
void Insert(char c, int x){
if (c == 'L'){
if (flag) qm.push_front(x);
else qm.push_back(x);
}
else{
if (flag) qm.push_back(x);
else qm.push_front(x);
}
l2++;
}
void Delete(char c){
if (c == 'L'){
if (flag) qm.pop_front();
else qm.pop_back();
}
else{
if (flag) qm.pop_back();
else qm.pop_front();
}
l2--;
}
void Reverse(){
flag = !flag;
}
void print(){
int cnt = 0, l = l1 + l2 + l3;
for (int i = 0;i < l1;++i) v[cnt++] = ql[i];
if (flag) for (int i = 0;i < l2;++i) v[cnt++] = qm[i];
else for (int i = l2-1;i >= 0;--i) v[cnt++] = qm[i];
for (int i = 0;i < l3;++i) v[cnt++] = qr[i];
for (int i = 0;i < l;++i) printf("%d%s", v[i], i == l-1 ? "\n" : " ");
}
int main(){
int T, n, num, l, r, m, x;
char c;
while (~scanf("%d", &T)){
while (T--){
Init();
scanf("%d", &n);
for (int i = 0;i < n;++i)
scanf("%d", v+i);
scanf("%d %d", &l, &r);
for (int i = 0;i < l-1;++i,++l1)
ql.push_back(v[i]);
for (int i = l-1;i < r;++i,++l2)
qm.push_back(v[i]);
for (int i = r;i < n;++i,++l3)
qr.push_back(v[i]);
scanf("%d", &m);
for (int i = 0;i < m;++i) {
scanf("%s", opr);
if (opr[0] == 'M' && opr[4] == 'L'){
scanf(" %c", &c);
MoveLeft(c);
}else if (opr[0] == 'M' && opr[4] == 'R'){
scanf(" %c", &c);
MoveRight(c);
}else if (opr[0] == 'I'){
scanf(" %c %d", &c, &x);
Insert(c, x);
}else if (opr[0] == 'D'){
scanf(" %c", &c);
Delete(c);
}else if (opr[0] == 'R'){
Reverse();
}
}
print();
}
}
return 0;
}