传送门

文章目录

  • 题意:
  • 思路:

题意:

你需要实现如下四个操作

q≤1e7q\le1e7q≤1e7

思路:

做的时候想了个链表的思路让队友写了,懒。
看了题解感觉题解还是很妙的。
你需要快速插入一个数在前后两端,还需要支持删除一个数和查询中间位置的数标号。
链表的思路比较明显,直接维护中点的位置,让后每次删除的时候将这个点的链表指向下一个点即可。就是写起来貌似不是很好写。
题解是维护了两个双端队列,一个代表左边,一个代表右边,输出答案的话就是右边的第一个位置。考虑两种情况:
(1)lsize>rsize(1)lsize>rsize(1)lsize>rsize,此时不平衡,需要将左边的最右端元素插入右边最左端。
(2)lsize+1<rsize(2)lsize+1<rsize(2)lsize+1<rsize,此时也不平衡,需要将右边的最左端元素插入左边的最右端。
让后删除操作就可以直接打个懒标记,遇到已经删掉的点的时候再将其移除队列。
复杂度O(n+q)O(n+q)O(n+q),跑了4s4s4s。。

// Problem: G - Boring data structure problem
// Contest: Virtual Judge - 2021多校第九场补题
// URL: https://vjudge.net/contest/454088#problem/G
// Memory Limit: 262 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#include<deque>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=20000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
deque<int>l,r;
int lsize,rsize;
int bel[N],st[N];void resize() {if(lsize>rsize) {while(st[l.back()]) l.pop_back();bel[l.back()]^=1;r.push_front(l.back()); l.pop_back();lsize--; rsize++;} else if(lsize+1<rsize) {while(st[r.front()]) r.pop_front();bel[r.front()]^=1;l.push_back(r.front()); r.pop_front();lsize++; rsize--; }
}int solve() {if(r.size()==0) return 0;while(st[r.front()]) r.pop_front();return r.front();
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0); cin>>n;int now=0;while(n--) {char op[2]; scanf("%s",op);if(op[0]=='L') l.push_front(++now),lsize++,bel[now]=0;else if(op[0]=='R') r.push_back(++now),rsize++,bel[now]=1;else if(op[0]=='G') {int x; scanf("%d",&x);st[x]=1; if(bel[x]==0) lsize--;else rsize--;} else printf("%d\n",solve());resize();}return 0;
}
/**/

HDU - 7072 Boring data structure problem 双端队列 + 思维相关推荐

  1. Boring data structure problem 模拟-双端队列

    题意 : 维护一个"双端队列",1e7次操作,支持左插入,右插入,按值删除,查找中点(靠右)值ceil[(m+1)/2]ceil[(m + 1) / 2]ceil[(m+1)/2] ...

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

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

  3. 双端队列--------------------------------思维(性质)

    解析: 由题目分析可知,双端队列中一定存在下面性质 所以我们要给原数组从小到大排序,判断他们能组成多少个这样的峰谷 但是有这么一个问题就是出现重复的数,那么他们下标的排列有可能是峰谷 例如:5,1,6 ...

  4. hdu 5380 Travel with candy(双端队列)

    题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量.每到一个位置,能够该商店的sell值 ...

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

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

  6. sv队列和动态数组的区别_Go 刷 LeetCode 系列:经典(7) 设计双端队列

    设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k.insertFront():将一个元素添加到双端队列头部.如果操作成功返回 true ...

  7. LeetCode 641. 设计循环双端队列

    文章目录 1. 题目信息 2. 解题 1. 题目信息 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront(): ...

  8. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  9. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

最新文章

  1. android 放大镜
  2. 深度探索C++ 对象模型(5)-Initialization list(3)
  3. 《数据挖掘与数据化运营实战 思路、方法、技巧与应用》—— 读书笔记
  4. 咋样路linux分区,linux下磁盘分区方法详解
  5. x86 vs x64
  6. 架构师进阶之独孤九剑:设计模式详解
  7. 测试人多少岁的软件,抖音你的三观多少岁免费测试app
  8. bootstraptable导出excel独立使用_JavaWeb系列之-一小时搞定POI导出Excel
  9. SAP License:关于SAP 对生产订单的月度结算
  10. 深入浅出MyBatis:MyBatis解析和运行原理
  11. 计算机基础是五笔吗,计算机基础 五笔一.ppt
  12. stylus -w style.styl -o style.css
  13. 用Multisim 14.1实现逻辑函数的化简与变换
  14. 用python对excel进行打印操作
  15. 操作系统学习笔记(二十八)~文件系统+连续分配+链接分配+索引分配+空闲空间管理
  16. 三十六 我在软件园的那些日子里
  17. vmware14 安装xp系统
  18. 一个技术青年的网络失足
  19. vue中滚动文字公告(2)-transition-slide
  20. PTA 数组 7-2 逆序存放数组中的数据,并输出指定元素

热门文章

  1. mysql mgr简介_MySQL Group Replication(MGR)使用简介与注意事项
  2. mysql老是自动停止_ecs云服务器 mysql经常自动停止挂掉重启问题分析
  3. python随机抽取人名_python的random
  4. foreach循环符合就不往下走了_柴油发电机组冷却液循环故障解决方法
  5. 震惊世界的亚洲8大奇迹,你都知道几个?
  6. 数学,原来可以这么美!
  7. 用 Python 实现打飞机
  8. activiti5.9 mysql_Activiti5.9换成MySQL数据库
  9. vue click事件_vue指令用法
  10. mysql批量条件字段_mysql批量更新多条记录的同一个字段为不同值的方法