题意:
一开始桌子上从上到下放着N本书(从上往下输入)
M组操作:
1.将前K本书翻转,2.在头上加一本书。最后输出书的顺序。(从上往下输出)
tip:
看起来像splay==线性做法是用deque 上面k本维护一个。。下面的一次往上添加,每次遇到add先加到上面的deque里,如果超过了k本,拿下最下面的给到另一个deque。。。需要注意的是,本题减小时间复杂度的突破口就是如何不真的旋转,而能做到旋转,设置flag。如果当前状态翻转,那么deque1的最上面那个是真实的最下面,加入的时候也要判断一下,加到deque1的front还是back
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>
#include <string>
using namespace std;
deque<string> q1,q2;
int n,m,k,flag;
char r[20];
void init(){
string s;
scanf("%d%d%d",&n,&m,&k);
for(int i = 1; i <= n ; i++){
cin >> s;
if(i <= k )
q1.push_back(s);
else q2.push_back(s);
}
}
void sov(){
for(int i = 1; i <= m ; i++){
scanf("%s",r);
if(r[0] == 'R') {
flag ^= 1;
continue;
}
int len = strlen(r),f = 0;
string add;
for(int i = 0 ; i <len ; i++){
if(r[i] == ')') break;
if(r[i] == '(') f = 1;
if(f == 1 && r[i] >= 'A'&& r[i] <= 'Z')
add += r[i];
}
if(flag) q1.push_back(add);
else q1.push_front(add);
if(q1.size() > k){
if(flag){
q2.push_front(q1.front());
q1.pop_front();
}
else{
q2.push_front(q1.back());
q1.pop_back();
}
}
}
}
void print(){
if(flag){
while(q1.size()){
cout << q1.back()<<endl;
q1.pop_back();
}
}
else{
while(q1.size()){
cout << q1.front()<<endl;
q1.pop_front();
}
}
while(q2.size()){
cout << q2.front()<<endl;
q2.pop_front();
}
}
int main(){
init();
sov();
print();
}