洛谷 P9518 queue
一眼模拟。
需要维护的东西可以根据操作求得:
- 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,在这个讨论帖里说的已经很明白了)。
要定义的东西如下:
const int Maxn = 1e6 + 7;
int Q, l = 1, r = 1, len;
string q[Maxn], p1, p2;
map <string, int> m;
操作中的细节
start
只要队列里有人,游戏就能进行。因为根据题意描述,若只有 A 在游戏且无人排队、A 可在结束游戏后成为队首并加入下一轮游戏,故队列无人时输出 Error。
否则,将上一轮游玩的人放回队尾,并取出这一轮游玩的人(\(\geq 1\),想一想,为什么),将其名字输出。
具体实现如下:
if(opt == "start") {
p1 = p2 = "";
while(l < r && len) {
while(l < r && m[q[l]] != l) ++l;
if(l < r)
m[q[l]] = r, q[r++] = q[l], ++l;
--len;
}
while(l < r && m[q[l]] != l)
++l;
if(l == r) {
puts("Error");
continue;
}
p1 = q[l];
cout << p1;
++len;
int pos = l + 1;
while(pos < r && m[q[pos]] != pos)
++pos;
if(pos < r)
p2 = q[pos], cout << ' ' << p2, ++len;
puts("");
}
arrive
没什么好说的,看代码:
if(opt == "arrive") {
cin >> t;
if(m[t])
puts("Error");
else
q[r++] = t, m[t] = r - 1, puts("OK");
}
leave
若 x 在队列里且 x 不为玩家,x 可以离队;否则不能。
if (opt == "leave") {
cin >> t;
if(m[t] && t != p1 && t != p2)
m[t] = 0, puts("OK");
else
puts("Error");
}
Warning
考场并没有卡暴力 \(O(n)\) 删除的做法,但考试结束后同机房的 @幻想繁星 就申请加了 hack 数据(试图卡掉时的讨论帖、hack 数据)
Talk is cheap, show you the code.
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 1e6 + 7;
int Q, l = 1, r = 1, len;
string q[Maxn], p1, p2;
map <string, int> m;
int main() {
ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
cin >> Q;
string opt, t;
while(Q--) {
cin >> opt;
if(opt == "start") {
p1 = p2 = "";
while(l < r && len) {
while(l < r && m[q[l]] != l) ++l;
if(l < r)
m[q[l]] = r, q[r++] = q[l], ++l;
--len;
}
while(l < r && m[q[l]] != l)
++l;
if(l == r) {
puts("Error");
continue;
}
p1 = q[l];
cout << p1;
++len;
int pos = l + 1;
while(pos < r && m[q[pos]] != pos)
++pos;
if(pos < r)
p2 = q[pos], cout << ' ' << p2, ++len;
puts("");
}
else if(opt == "arrive") {
cin >> t;
if(m[t])
puts("Error");
else
q[r++] = t, m[t] = r - 1, puts("OK");
}
else {
cin >> t;
if(p1 == t || p2 == t || !m[t])
puts("Error");
else
m[t] = 0, puts("OK");
}
}
return 0;
}
洛谷 P9518 queue的更多相关文章
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- 洛谷P1519 穿越栅栏 Overfencing
P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...
- 洛谷P1238 走迷宫
洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...
- 洛谷P1189 逃跑的拉尔夫(SEARCH)
洛谷1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的 ...
- 洛谷P1126 机器人搬重物
洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...
- 洛谷P1117 棋盘游戏
洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...
- 洛谷1001 A+B Problem
洛谷1001 A+B Problem 本题地址:http://www.luogu.org/problem/show?pid=1001 题目描述 输入两个整数a,b,输出它们的和(|a|,|b|< ...
- 洛谷P1962 斐波那契数列【矩阵运算】
洛谷P1962 斐波那契数列[矩阵运算] 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) ( ...
随机推荐
- JavaCV人脸识别三部曲之一:视频中的人脸保存为图片
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于人脸识别 本文是<JavaCV人脸识别三部曲 ...
- 【原创】xenomai内核解析-xenomai实时线程创建流程
版权声明:本文为本文为博主原创文章,未经同意,禁止转载.如有错误,欢迎指正,博客地址:https://www.cnblogs.com/wsg1100/ 目录 问题概述 1 libCobalt中调用非实 ...
- Unity中的InitializeOnLoad特性:深入解析与实践
Unity中的InitializeOnLoad特性:深入解析与实践 在Unity开发过程中,我们经常需要在编辑器启动时或脚本重新编译后执行一些操作,例如初始化数据.注册事件等.这时,我们可以使用Ini ...
- 4.10 x64dbg 反汇编功能的封装
LyScript 插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此时就需要根据自身需要进行二次开发,以实现更加高级的功能.本章将继续深入探索反汇编 ...
- Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录
前言 之前自己写的flask使用gunicorn上线生产环境没有什么问题,但是最近搭建了一个现成的flask项目,当使用python直接运行时不会有问题,而使用gunicorn时则会出现一些问题. 部 ...
- (占坑编辑中)hexo博客github page更换域名
hexo博客github page更换域名 檗科下的Cname文件一定要改为最近的域名
- Python 学习笔记:基础篇
! https://zhuanlan.zhihu.com/p/644232952 Python 学习笔记:基础篇 承接之前在<[[Python 学习路线图]]>一文中的规划,接下来,我将会 ...
- Nginx配置网站默认https
Nginx配置网站默认https 一.安装Nginx yum install nginx -y 二.修改nginx.conf vim /etc/nginx/nginx.conf 配置80转443 配置 ...
- Nextcloud允许不被信任的域访问 取消 trusted domains
在服务器部署了Nextcloud,由于测试需要,经常从不同的地址访问,但是每次访问都要把域名添加到受信任域,反反复复修改也挺麻烦,暂时又没找到通配符或者禁用的方法. 不过网上提供了一个替代方法,动态生 ...
- [golang]gin框架接收websocket通信
前言 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...