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_backpop_frontfrontback 操作,若当前双端队列为空则不进行,直接跳过该次操作。

输入格式

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

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

输出格式

对于每个 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 \leqmq≤q \leqq分值
111101010101010101010
222200020002000200020002000202020
33310510^510510510^5105303030
44410610^610610610^6106404040

对于所有数据,1≤m,q≤1061 \leq m,q \leq 10^61m,q1061≤x≤1091 \leq x \leq 10^91x109

思路

排序后用双端队列即可。

代码见下

#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;
}
posted @ 2025-10-29 21:21  bz02_2023f2  阅读(3)  评论(0)    收藏  举报  来源