B3656 【模板】双端队列 1题解
B3656 【模板】双端队列 1
题目背景
Aya 衷心祝愿大家不再因为 std::deque 重蹈覆辙。
题目描述
请你实现 mmm 个双端队列,支持如下的 qqq 次操作:
push_back(a,x):在第 aaa 个双端队列中从尾部插入一个元素 xxx;pop_back(a):在第 aaa 个双端队列中从尾部弹出一个元素。push_front(a,x):在第 aaa 个双端队列中从头部插入一个元素 xxx;pop_front(a):在第 aaa 个双端队列中从头部弹出一个元素。size(a):查询第 aaa 个双端队列的元素个数;front(a):查询第 aaa 个双端队列的队首元素;back(a):查询第 aaa 个双端队列的队尾元素;
对于 pop_back,pop_front,front 和 back 操作,若当前双端队列为空则不进行,直接跳过该次操作。
输入格式
输入的第一行是一个正整数 qqq,表示操作次数。
接下来 qqq 行,每行先是一个字符串,保证为 push_back 或者 pop_back 或者 push_front 或者 pop_front 或者 size 或者 front 或者 back 之一。接下来是 111 或 222 个正整数,分别表示 aaa 和 xxx。
输出格式
对于每个 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 \leqm≤ | q≤q \leqq≤ | 分值 |
|---|---|---|---|
| 111 | 101010 | 101010 | 101010 |
| 222 | 200020002000 | 200020002000 | 202020 |
| 333 | 10510^5105 | 10510^5105 | 303030 |
| 444 | 10610^6106 | 10610^6106 | 404040 |
对于所有数据,1≤m,q≤1061 \leq m,q \leq 10^61≤m,q≤106,1≤x≤1091 \leq x \leq 10^91≤x≤109。
思路
排序后用双端队列即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
int t,n,a[10000007],b=0,d=0,c;
struct one{
string s;
long long a,c,d,f;
}aa[1000006];
bool cmp(one a1,one b1){
if(a1.a!=b1.a){
return a1.a<b1.a;
}
else{
return a1.d<b1.d;
}
}
bool cmp2(one a1,one b1){
if(a1.d!=b1.d){
return a1.d<b1.d;
}
else{
return a1.a<b1.a;
}
}
string s2[1000006],s;
int main(){
t=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>aa[i].s;
if(aa[i].s=="push_back"||aa[i].s=="push_front"){
cin>>aa[i].a>>aa[i].c;
}
else{
cin>>aa[i].a;
}
aa[i].d=i;
}
sort(aa+1,aa+n+1,cmp);
while(t--){
b=3e6+1;
d=3e6;
cin>>n;
for(int i=1;i<=n;i++){
if(i==1||aa[i].a!=aa[i-1].a){
b=3e6;
d=3e6+1;
}
s=aa[i].s;
if(s=="push_back"){
c=aa[i].c;
a[++b]=c;
}
else if(s=="push_front"){
c=aa[i].c;
a[--d]=c;
}
else if(s=="front"){
if(d<=b){
aa[i].f=a[d];
}
else{
//cout<<"ERR_CANNOT_QUERY"<<endl;
}
}
else if(s=="back"){
if(d<=b){
aa[i].f=a[b];
}
else{
//cout<<"ERR_CANNOT_QUERY"<<endl;
}
}
else if(s=="size"){
aa[i].f=b-d+1;
//cout<<b<<" "<<d<<endl;
}
else if(s=="pop_front"){
if(d<=b){
d++;
}
else{
//cout<<"ERR_CANNOT_POP"<<endl;
}
}
else{
if(d<=b){
b--;
}
else{
//cout<<"ERR_CANNOT_POP"<<endl;
}
}
}
}
sort(aa+1,aa+n+1,cmp2);
for(int i=1;i<=n;i++){
if(aa[i].f!=0||aa[i].s=="size"){
cout<<aa[i].f<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号