题目描述
栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题。
这个数据结构形如一个"长条形"的容器,一开始该容器是空的,有以下七种操作:
1 1 1 a a a:从前面插入一个元素 a a a
2 2 2:从前面删除一个元素
3 3 3 a a a:从后面插入一个元素 a a a
4 4 4:从后面删除一个元素
5 5 5:将整个容器头尾翻转
6 6 6:输出当前容器中元素的个数和所有元素
7 7 7:将所有元素从小到大排序
请你模拟这个数据结构的所有操作。
输入格式
第一行包含两个整数 n , m n, m n,m,其中:
n n n 表示容器中最多可以存储的元素个数(保证不会超过 n n n)
m m m 表示操作的总次数
接下来 m m m 行,每行表示一个操作,格式如上所述。所有操作保证合法(例如不会在容器为空时删除元素)。
特别地,操作 6 6 6 和 7 7 7 总共不会超过 10 10 10 次。
输出格式
每当执行一次操作 6 6 6,请输出两行:
第一行输出当前容器中元素的个数
第二行按照当前容器顺序输出所有元素(从头到尾),相邻元素之间用一个空格隔开,末尾不能有空格。
输入样例
cpp
10 9
1 1
3 5
3 4
6
4
5
6
7
6
输出样例
cpp
3
1 5 4
2
5 1
2
1 5
说明/提示
【数据范围】:
-
1 ≤ n ≤ 50000 1 ≤ n ≤ 50000 1≤n≤50000
-
1 ≤ m ≤ 200000 1 ≤ m ≤ 200000 1≤m≤200000
-
所有插入的 a a a 满足 1 ≤ a ≤ 100000 1 ≤ a ≤ 100000 1≤a≤100000
提交链接
思路分析
deque
就是一个两头操作的队列。
- 有头插,尾插:
push_front()/push_back()
- 有头删,尾删:
pop_front()/pop_back()
- 工作性算法:
sort
(排序),reverse
(倒置)
✅ 操作 1:从前插入
cpp
if (op == 1) {
cin >> a;
q.push_front(a);
}
插入到容器前端,时间复杂度 O ( 1 ) O(1) O(1)。
✅ 操作 2:从前删除
cpp
else if (op == 2) {
q.pop_front();
}
删除容器前端第一个元素,时间复杂度 O ( 1 ) O(1) O(1)。
✅ 操作 3:从后插入
cpp
else if (op == 3) {
cin >> a;
q.push_back(a);
}
插入到容器末尾,时间复杂度 O ( 1 ) O(1) O(1)。
✅ 操作 4:从后删除
cpp
else if (op == 4) {
q.pop_back();
}
删除容器尾部元素,时间复杂度 O ( 1 ) O(1) O(1)。
✅ 操作 5:整体翻转容器
cpp
else if (op == 5) {
reverse(q.begin(), q.end());
}
使用 reverse()
函数直接反转整个 deque
。
时间复杂度 O(n)
,但题目说明操作次数较少(最多 10 10 10 次),完全可以接受。
✅ 操作 6:输出容器内容
cpp
else if (op == 6) {
cout << q.size() << endl;
for (int x : q)
cout << x << " ";
cout << endl;
}
输出容器当前大小及所有元素。
完整代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
deque<int> q;
while (m--) // m次操作
{
int op, a;
cin >> op; // 操作几 1~7
if (op == 1)
{
cin >> a;
q.push_front(a);
}
else if (op == 2)
{
q.pop_front();
}
else if (op == 3)
{
cin >> a;
q.push_back(a);
}
else if (op == 4)
{
q.pop_back();
}
else if (op == 5)
{
reverse(q.begin(), q.end());
}
else if (op == 6)
{
cout << q.size() << endl;
for (int x : q)
cout << x << " ";
cout << endl;
}
else
{
sort(q.begin(), q.end());
}
}
return 0;
}