【模板】双端队列 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_back
,pop_front
,front
和 back
操作,若当前双端队列为空则不进行,直接跳过该次操作。
输入格式
输入的第一行是一个正整数 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 1≤m,q≤106, 1 ≤ x ≤ 1 0 9 1 \leq x \leq 10^9 1≤x≤109。
题目分析
这是一道双端队列的板子题目,但是用双端队列明显会MLE,所以我们就需要用链表—list来维护一下
注意 : : :对于
pop_back
,pop_front
,front
和back
操作,若当前双端队列为空则不进行,直接跳过该次操作。
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();
}
}