T427220 【模板】双端队列
题目背景
原题[
B3656 【模板】双端队列 1](https://www.luogu.com.cn/problem/B3656)
$\color{red}请认真阅读以下文字,否则可能出现MLE错误$
此题由于stl容器deque的空间效率问题,使用deque会导致所有的测试点**MLE**(空间溢出)。
`std::deque` 的实现效率差并且有着很大的空间常数,一个只包含一个元素的 `std::deque` 也将会占用其变量类型 16 倍或者 4096 字节的内存。若开 `std::deque q[1000005]`,将占据约 650 MB 内存,这将直接导致 **MLE**。即使给予足够空间在 `std::deque` 的效率下也将 **TLE**。
**由于 `std::queue()` 和 `std::stack()` 也是依赖于 `std::deque` ,故使用时也应注意时间和空间效率问题。**
如果不要求支持随机访问(用下标访问),`std::deque` 可以用 `std::list` 代替,两者成员函数类似。
题目描述
请你实现 $m$ 个双端队列,支持如下的 $q$ 次操作:
- `push_back(a,x)`:在第 $a$ 个双端队列中从尾部插入一个元素 $x$;
- `pop_back(a)`:在第 $a$ 个双端队列中从尾部弹出一个元素。
- `push_front(a,x)`:在第 $a$ 个双端队列中从头部插入一个元素 $x$;
- `pop_front(a)`:在第 $a$ 个双端队列中从头部弹出一个元素。
- `size(a)`:查询第 $a$ 个双端队列的元素个数;
- `front(a)`:查询第 $a$ 个双端队列的队首元素;
- `back(a)`:查询第 $a$ 个双端队列的队尾元素;
对于 `pop_back`,`pop_front`,`front` 和 `back` 操作,若当前双端队列为空则不进行,直接跳过该次操作。
输入格式
输入的第一行是一个正整数 $q$,表示操作次数。
接下来 $q$ 行,每行先是一个字符串,保证为 `push_back` 或者 `pop_back` 或者 `push_front` 或者 `pop_front` 或者 `size` 或者 `front` 或者 `back` 之一。接下来是 $1$ 或 $2$ 个正整数,分别表示 $a$ 和 $x$。
输出格式
对于每个 `size` 或者 `front` 或者 `back` 操作,输出一行表示答案。
说明/提示
**【数据范围】**
| 子任务 | $m \leq$ | $q \leq$ | 分值 |
| :-----------: | :-----------: | :-----------: | :-----------: |
| $1$ | $10$ | $10$ | $10$ |
| $2$ | $2000$ | $2000$ | $20$ |
| $3$ | $10^5$ | $10^5$ | $30$ |
| $4$ | $10^6$ | $10^6$ | $40$ |
对于所有数据,$1 \leq m,q \leq 10^6$,$1 \leq x \leq 10^9$。