一眼模拟。

需要维护的东西可以根据操作求得:

  • start:正在玩游戏的 \(1\) 或 \(2\) 个人;
  • arrive:当前在排队但没玩游戏的队列、每个人是否在排队、游玩;
  • leave:每个人是否在排队、游玩。

如何维护

正在玩游戏的人

我们使用 \(p_1\)、\(p_2\) 两变量存储,优先保证 \(p_1\) 有值,当 \(p_1\) 为空时上一轮无人游玩,\(p_2\) 为空时上一轮仅有一人游玩。

tips:由于优先保证 \(p_1\) 有值,故 \(p_2\) 为空时 \(p_1\) 非空。


当前在排队但没玩游戏的队列

用数组模拟队列并惰性删除即可。

tips:将正在玩游戏的人放到队首,并在玩完游戏后将其放到队尾,只用维护一个“队列”即可。


每个人是否在排队、游玩

map 映射名字到队列中的位置即可(tips:为什么不映射 bool,在这个讨论帖里说的已经很明白了)。

要定义的东西如下:

  1. const int Maxn = 1e6 + 7;
  2. int Q, l = 1, r = 1, len;
  3. string q[Maxn], p1, p2;
  4. map <string, int> m;

操作中的细节

start

只要队列里有人,游戏就能进行。因为根据题意描述,若只有 A 在游戏且无人排队、A 可在结束游戏后成为队首并加入下一轮游戏,故队列无人时输出 Error

否则,将上一轮游玩的人放回队尾,并取出这一轮游玩的人(\(\geq 1\),想一想,为什么),将其名字输出。

具体实现如下:

  1. if(opt == "start") {
  2. p1 = p2 = "";
  3. while(l < r && len) {
  4. while(l < r && m[q[l]] != l) ++l;
  5. if(l < r)
  6. m[q[l]] = r, q[r++] = q[l], ++l;
  7. --len;
  8. }
  9. while(l < r && m[q[l]] != l)
  10. ++l;
  11. if(l == r) {
  12. puts("Error");
  13. continue;
  14. }
  15. p1 = q[l];
  16. cout << p1;
  17. ++len;
  18. int pos = l + 1;
  19. while(pos < r && m[q[pos]] != pos)
  20. ++pos;
  21. if(pos < r)
  22. p2 = q[pos], cout << ' ' << p2, ++len;
  23. puts("");
  24. }

arrive

没什么好说的,看代码:

  1. if(opt == "arrive") {
  2. cin >> t;
  3. if(m[t])
  4. puts("Error");
  5. else
  6. q[r++] = t, m[t] = r - 1, puts("OK");
  7. }

leave

x 在队列里且 x 不为玩家,x 可以离队;否则不能。

  1. if (opt == "leave") {
  2. cin >> t;
  3. if(m[t] && t != p1 && t != p2)
  4. m[t] = 0, puts("OK");
  5. else
  6. puts("Error");
  7. }

Warning

考场并没有卡暴力 \(O(n)\) 删除的做法,但考试结束后同机房的 @幻想繁星 就申请加了 hack 数据(试图卡掉时的讨论帖hack 数据

Talk is cheap, show you the code.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int Maxn = 1e6 + 7;
  4. int Q, l = 1, r = 1, len;
  5. string q[Maxn], p1, p2;
  6. map <string, int> m;
  7. int main() {
  8. ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
  9. cin >> Q;
  10. string opt, t;
  11. while(Q--) {
  12. cin >> opt;
  13. if(opt == "start") {
  14. p1 = p2 = "";
  15. while(l < r && len) {
  16. while(l < r && m[q[l]] != l) ++l;
  17. if(l < r)
  18. m[q[l]] = r, q[r++] = q[l], ++l;
  19. --len;
  20. }
  21. while(l < r && m[q[l]] != l)
  22. ++l;
  23. if(l == r) {
  24. puts("Error");
  25. continue;
  26. }
  27. p1 = q[l];
  28. cout << p1;
  29. ++len;
  30. int pos = l + 1;
  31. while(pos < r && m[q[pos]] != pos)
  32. ++pos;
  33. if(pos < r)
  34. p2 = q[pos], cout << ' ' << p2, ++len;
  35. puts("");
  36. }
  37. else if(opt == "arrive") {
  38. cin >> t;
  39. if(m[t])
  40. puts("Error");
  41. else
  42. q[r++] = t, m[t] = r - 1, puts("OK");
  43. }
  44. else {
  45. cin >> t;
  46. if(p1 == t || p2 == t || !m[t])
  47. puts("Error");
  48. else
  49. m[t] = 0, puts("OK");
  50. }
  51. }
  52. return 0;
  53. }

洛谷 P9518 queue的更多相关文章

  1. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  2. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  3. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  4. 洛谷P1519 穿越栅栏 Overfencing

    P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...

  5. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  6. 洛谷P1189 逃跑的拉尔夫(SEARCH)

    洛谷1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的 ...

  7. 洛谷P1126 机器人搬重物

    洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...

  8. 洛谷P1117 棋盘游戏

    洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...

  9. 洛谷1001 A+B Problem

    洛谷1001 A+B Problem 本题地址:http://www.luogu.org/problem/show?pid=1001 题目描述 输入两个整数a,b,输出它们的和(|a|,|b|< ...

  10. 洛谷P1962 斐波那契数列【矩阵运算】

    洛谷P1962 斐波那契数列[矩阵运算] 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) ( ...

随机推荐

  1. Kubernetes(k8s)访问控制:权限管理之RBAC鉴权

    目录 一.系统环境 二.前言 三.Kubernetes访问控制 四.鉴权简介 五.配置客户端机器 六.设置k8s集群允许所有请求访问 七.设置k8s集群拒绝所有请求访问 八.RBAC授权 8.1 ro ...

  2. 大模型微调技术LoRA与QLoRA

    LoRA: Low-Rank Adaptation of Large Language Models 动机 大模型的参数量都在100B级别,由于算力的吃紧,在这个基础上进行所有参数的微调变得不可能.L ...

  3. 基于 Probe 的实时全局光照方案(Probe-based Global Illumination)

    目录 Precomputed Probe 预放置 probes 四面体镶嵌(Tetrahedral Tessellations) Indirect Light Cache Volumetric Lig ...

  4. 【2020GET】即构科技蒋宁波:教育行业客户需求的核心是什么?

    11月24日,由即构科技主办的2020GET大会教育科技分论坛在北京成功召开,来自叮咚课堂.小冰.360OS.蕃茄田艺术.即构科技的6位资深教育/科技大咖,在论坛上进行深度分享. 以下为即构科技联合创 ...

  5. Day14_Java_作业

    编程题: 1:获取10个1-20之间的随机数,要求不能重复 答: package StudentWork; import java.util.ArrayList; /** * * 需求: 1:获取10 ...

  6. subprocess Python执行系统命令最优选模块

    简介 subprocess 是 Python 中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls /etc/user ifconfig 等和操作系统有关的命令. subprocess 创建子 ...

  7. Redis的设计与实现(5)-整数集合

    整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现. 整数集合 (intset) 是 Re ...

  8. Mediabox:年度最佳音视频开发工具

    "2023稀土开发者大会"落下帷幕,由稀土掘金社区评选的的掘金技术引力榜重磅出炉,共有22个优秀实践案例上榜,涵盖对技术行业发展有特别贡献的人物.开发工具.开源项目.技术团队和技术 ...

  9. 简单解决jsp中文乱码问题

    简单解决jsp中文乱码问题 初学jsp制作一个简单的响应页面 具体代码如下: <form action="test.jsp"> username : <input ...

  10. ITIL4与Devops(一)

    目录 一.服务管理与ITIL 1.1 服务管理现状 1.2 服务管理原则 1.3 ITIL版本发展历程 ITIL2 服务支持 服务交付 服务战略 ITIL3 框架 职能 ITIL 2011 流程的基本 ...