题意 :

  • 维护一个“双端队列”,1e7次操作,支持左插入,右插入,按值删除,查找中点(靠右)值ceil[(m+1)/2]ceil[(m + 1) / 2]ceil[(m+1)/2],值不重复。

思路 :

  • 1e7所以所有操作都要满足O(1)O(1)O(1)
  • deque不论是front,back,push_front,push_back,pop_front,pop_back都是O(1)O(1)O(1)
  • 查询中间位置,因此想到用两个双端队列维护,由于每次只插入一个数,不难维护前后者长度一样
  • 删除操作,由于插入的值1−1e71 - 1e71−1e7,可以使用数组记录每个数属于哪个双端队列,删除时直接将vis改为0且更新对应双端队列的长度即可,查询时只要先将在右双端队列左端前vis == 0的值去掉即可,注意删除后也要维护两个双端队列长度一致。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <ctime>
#define endl '\n'
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define lowbit(x) (x&-x)
using namespace std;
const double pi = acos(-1);
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<long, long> PLL;const int N = 1e7 + 10;int vis[N], tot;
deque<int> lq, rq;
int lc, rc;     // 记录不用纠结vis数组的非真实情况的左右双端队列的长度// 每次修改长度后,维护lc == rc / lc + 1 == rc
void del()
{// 左双端队列比右双端队列大while (lc > rc){while (vis[lq.back()] == 0) lq.pop_back();rq.push_front(lq.back());lq.pop_back();vis[rq.front()] = 2;lc -- , rc ++ ;}// 右双端队列比左双端队列+1还大while (rc > lc + 1){while (vis[rq.front()] == 0) rq.pop_front();lq.push_back(rq.front());rq.pop_front();vis[lq.back()] = 1;lc ++ , rc -- ;}
}int main()
{IOS;int q;cin >> q;while (q -- ){string op;cin >> op;if (op == "L"){lq.push_front( ++ tot);vis[tot] = 1;lc ++ ;del();}else if (op == "R"){rq.push_back( ++ tot);vis[tot] = 2;rc ++ ;del();}else if (op == "G"){int x;cin >> x;if (vis[x] == 1) lc -- ;if (vis[x] == 2) rc -- ;vis[x] = 0;del();}else{while (vis[rq.front()] == 0) rq.pop_front();cout << rq.front() << endl;}}return 0;
}

Boring data structure problem 模拟-双端队列相关推荐

  1. HDU - 7072 Boring data structure problem 双端队列 + 思维

    传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...

  2. 【Python养成】:案例(设计三维向量类、实现向量的加法、减法以及向量与标量的乘法和除法运算、编写自定义类,模拟内置集、编写自定义类,模拟双端队列。)

    学习内容:设计三维向量类.实现向量的加法.减法以及向量与标量的乘法和除法运算 设计三维向量类.实现向量的加法.减法以及向量与标量的乘法和除法运算 实验代码: class Vector_3D:def _ ...

  3. 【POJ - 2823】 Sliding Window(单调队列 用双端队列实现或模拟队列)

    题干: An array of size n ≤ 10 6 is given to you. There is a sliding window of size k which is moving f ...

  4. 码蹄集 - MT2140 - 双端队列

    传送门 双端队列 题目描述 输入描述 数据范围 输出描述 样例一 输入 输出 题目分析 AC代码 双端队列 双端队列 . 时间限制:1秒 空间限制:128M 题目描述 小码哥想创建一个双端队列,即,两 ...

  5. bzoj 2457 [BeiJing2011]双端队列 模拟+贪心

    [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 457  Solved: 203 [Submit][Status] ...

  6. 2018 “百度之星”程序设计大赛 - 初赛(A)P1002度度熊学队列(双端队列模拟,STL)

    problem 度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 N 个空的双端队列(编号为 1 到 N ),你要支持度度熊的 Q 次操作. ①1 u w val 在编号为 u 的 ...

  7. HDU 4286 Data Handler [栈,双端队列]

    这题比较容易想到的做法是splay,但是splay写起来比较麻烦而且每次操作都有LogN的复杂度,双向链表也是可以实现的,但实践起来比较麻烦,尤其是翻转操作... 可以发现每次L或者R都是移动一位的, ...

  8. LeetCode实战:设计循环双端队列

    题目英文 Design your implementation of the circular double-ended queue (deque). Your implementation shou ...

  9. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

最新文章

  1. Android Activity跳转动画,让你的APP瞬间绚丽起来
  2. 2010有道难题练习赛2
  3. 双十一购物节,Nacos 1.4.0 + Go SDK 1.0.1发布
  4. 网络流Dinic算法模板 POJ1273
  5. 【demo练习二】:WPF依赖属性的练习
  6. inDesign教程,如何将inDesign文档导出为 PDF 文件?
  7. rost反剽窃检测系统_论文为什么需要进行查重检测?
  8. Ubuntu18.04 下的Gif录制工具
  9. IDEA Jsp乱码大全
  10. android云控开源,Android EasyClient 云台控制开源流媒体摄像机EasyCamera
  11. java4android 教程_《Java4Android视频教程》学习笔记(三)
  12. 联想e480一键恢复小孔_联想一键恢复的使用方法
  13. 医院在线预约挂号系统 jsp+mysql+maven
  14. ODM、JDM、OEM概念
  15. 树莓派安装NOOBS失败
  16. python计算绩效工资编程_Python实战精选:计算销售提成
  17. PAT - 1028 人口普查
  18. c语言基础难关:按位取反
  19. 西安交大城市学院计算机怎么,西安交大城市学院计算机系在“量子计算机”教研领域获得显著进展...
  20. windows API程序设计入门(简单练习)

热门文章

  1. SM01 事务代码的加锁以及解锁
  2. SAP财务中国本土好内容
  3. SAP Basis: 从SAP GUI杀死进程
  4. 通过销售订单领用到成本中心,FI替代实现不同成本中心记账科目不同
  5. SAP PO相关打印编程
  6. 买淘宝特价版,产业升级的证明
  7. “内卷化”的快手与抖音——2020年短视频的“无聊经济”往何处去
  8. validate验证长度 vue_vue input 输入校验字母数字组合且长度小于30的实现代码
  9. linux怎么运行ing,Linux命令笔记ing
  10. vue怎么截取时间年月_Vue + Element 获取标准时间、时间戳进行转换与操作(年月日)...