SGU 271 Book Pile(deque)

题意:

一开始桌子上从上到下放着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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值