刷题之洛谷 B3656

【模板】双端队列 1

题目背景

Aya 衷心祝愿大家不再因为 std::deque() 重蹈覆辙。

题目描述

请你实现 m m m 个双端队列,支持如下的 q q q 次操作:

  • push_back(a,x):在第 a a a 个双端队列中从尾部插入一个元素 x x x
  • pop_back(a):在第 a a a 个双端队列中从尾部弹出一个元素。
  • push_front(a,x):在第 a a a 个双端队列中从头部插入一个元素 x x x
  • pop_front(a):在第 a a a 个双端队列中从头部弹出一个元素。
  • size(a):查询第 a a a 个双端队列的元素个数;
  • front(a):查询第 a a a 个双端队列的队首元素;
  • back(a):查询第 a a a 个双端队列的队尾元素;

对于 pop_backpop_frontfrontback 操作,若当前双端队列为空则不进行,直接跳过该次操作。

输入格式

输入的第一行是一个正整数 q q q,表示操作次数。

接下来 q q q 行,每行先是一个字符串,保证为 push_back 或者 pop_back 或者 push_front 或者 pop_front 或者 size 或者 front 或者 back 之一。接下来是 1 1 1 2 2 2 个正整数,分别表示 a a a x x x

输出格式

对于每个 size 或者 front 或者 back 操作,输出一行表示答案。

样例 #1

样例输入 #1

10
pop_back 2
push_back 1 1
push_front 1 3
push_front 2 2
push_front 2 3
pop_back 1
size 1
push_back 2 3
back 1
front 1

样例输出 #1

1
3
3

提示

【数据范围】

子任务 m ≤ m \leq m q ≤ q \leq q分值
1 1 1 10 10 10 10 10 10 10 10 10
2 2 2 2000 2000 2000 2000 2000 2000 20 20 20
3 3 3 1 0 5 10^5 105 1 0 5 10^5 105 30 30 30
4 4 4 1 0 6 10^6 106 1 0 6 10^6 106 40 40 40

对于所有数据, 1 ≤ m , q ≤ 1 0 6 1 \leq m,q \leq 10^6 1m,q106 1 ≤ x ≤ 1 0 9 1 \leq x \leq 10^9 1x109

题目分析

这是一道双端队列的板子题目,但是用双端队列明显会MLE,所以我们就需要用链表—list来维护一下

注意 : : :对于 pop_backpop_frontfrontback 操作,若当前双端队列为空则不进行,直接跳过该次操作。

Code

#include <bits/stdc++.h>
using ll=long long;

using namespace std;

namespace langfengya
{
    void Main();
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    langfengya::Main();
    return 0;
}

namespace langfengya
{
    int n;
    list<ll> q[1000010];
    void read()
    {
        cin >> n;
    }
    void find()
    {
        string s;
        cin >> s;
        if (s == "push_back")//在第a个链表的尾部插入一个元素x
        {
            int x;
            ll y;
            cin >> x >> y;
            q[x].push_back(y);
        }
        else if (s == "pop_back")//在第a个链表的尾部弹出一个元素
        {
            int x;
            cin >> x;
            if (q[x].empty()) return ;
                q[x].pop_back();
        }
        else if (s == "push_front")//在第a个链表的头部插入一个元素x
        {
            int x;
            ll y;
            cin >> x >> y;
            q[x].push_front(y);
        }
        else if (s == "pop_front")//在第a个链表的头部弹出一个元素
        {
            int x;
            cin >> x;
            if (q[x].empty()) return ;
                q[x].pop_front();
        }
        else if (s == "size")//查询第a个链表的元素个数;
        {
            int x;
            cin >> x;
            cout << q[x].size() << endl;
        }
        else if (s == "front")//查询第a个链表的队首元素;
        {
            int x;
            cin >> x;
            if (q[x].empty()) return ;
                cout << q[x].front() << endl;
        }
        else    //查询第a个链表的队尾元素;
        {
            int x;
            cin >> x;
            if (q[x].empty()) return ;
            cout << q[x].back() << endl;
        }
    }
    void solve()
    {
        for (int i = 1; i <= n; i++)
        {
            find();
        }
    }
    void Main()
    {
        read();
        solve();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值