注:只是看到题目,未评测,所以不确定代码正确性,但是算法思路没有问题

描述

同学们的bug还真是多啊,orz...

春节期间大家存下的bug都来找肖老师解决了。

每个人都有bug,但是肖老师却只有一个啊。怎么办?

所以肖老师让大家按先来后到的顺序排队,一个一个的给大家解决。

这不一大早起来,肖老师就等着同学们过来解决bug了。不过肖老师偶尔想知道当前队伍中bug数量最少的是多少bug。

sos xbug操作表示有一个同学有x个bug,并且过来排队等待肖老师解决。

ok 操作表示肖老师已经解决了排在队伍最前面同学的所有bug。

min 操作表示肖老师需要知道当前排队队伍中bug数量最少的是多少bug。

输入格式

第一行输入一个正整数n,表示总共有n种操作。

接下来输入n行,每行一种操作。

【限制条件】

1≤n≤10^6

每个人的bug数量不超过1000000。

输出格式

对于每一次min操作,输出当前排队中bug最少的数量。

如果执行min(或者ok)操作时,当前队伍为空,则输出“So happy!No bug!”。

样例输入

7
sos 6bug
sos 7bug
min
ok
min
ok
min

样例输出

6bug
7bug
So happy!no bug!

这道问题可以用单调队列求解,代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000100; /**
* zifeiy: 单调队列解法
*/ queue<int> normal_que;
deque<int> min_que;
int a[maxn], n, cnt = 0;
string s; int main() {
cin >> n;
while (n --) {
cin >> s;
if (s == "sos") {
scanf("%dbug", &a[cnt]);
normal_que.push(cnt);
while (!min_que.empty()) {
int u = min_que.back();
if (a[u] >= a[cnt]) min_que.pop_back();
else break;
}
min_que.push_back(cnt);
cnt ++;
}
else if (s == "ok") {
if (normal_que.empty()) {
puts("So happy!No bug!");
} else {
int u = normal_que.front();
normal_que.pop();
while (!min_que.empty() && min_que.front() <= u) {
min_que.pop_front();
}
}
}
else { // "min"
if (min_que.empty()) {
puts("So happy!No bug!");
} else {
cout << a[min_que.front()] << "bug" << endl;
}
}
}
return 0;
}

也可以转换成求解RMQ问题,我这里使用线段树来实现RMQ:

#include <bits/stdc++.h>
using namespace std;
#define INF (1<<29)
const int maxn = 1000100; int minn[maxn<<2], n, m, a;
vector<int> vec;
vector<int> queries; // 0表示sos,1表示min,2表示ok
char ch[111]; void build(int l, int r, int rt) {
if (l == r) minn[rt] = vec[l];
else {
int mid = (l + r) >> 1;
build(l, mid, rt<<1);
build(mid+1, r, rt<<1|1);
minn[rt] = min(minn[rt<<1], minn[rt<<1|1]);
}
} int query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) return minn[rt];
int mid = (l + r) >> 1;
int tmp = INF;
if (L <= mid) tmp = min(tmp, query(L, R, l, mid, rt<<1));
if (mid+1 <= R) tmp = min(tmp, query(L, R, mid+1, r, rt<<1|1));
return tmp;
} void test() {
puts("[test]");
cout << "n = " << n << endl;
cout << "min{1,2} = " << query(0, 1, 0, n-1, 1) << endl;
cout << "min{2,2} = " << query(1, 1, 0, n-1, 1) << endl;
} int main() {
scanf("%d", &m);
for (int i = 0; i < m; i ++) {
scanf("%s", ch);
if (strcmp(ch, "sos") == 0) {
scanf("%dbug", &a);
vec.push_back(a);
queries.push_back(0);
n ++;
}
else if (strcmp(ch, "min") == 0) {
queries.push_back(1);
}
else {
queries.push_back(2);
}
}
build(0, n-1, 1);
int L = 0, R = -1;
// test
//for (int i = 0; i < m; i ++) {
// printf("queries[%d] = %d\n", i, queries[i]);
//} for (int i = 0; i < m; i ++) {
if (queries[i] == 0) R ++;
else if (queries[i] == 2) { if (L <= R) L ++; }
else { // 1 - min
// cout << "[ " << L << "," << R << " ] : fuck!" << endl;
if (L > R) puts("So happy!no bug!");
else printf("%dbug\n", query(L, R, 0, n-1, 1));
}
} // test(); return 0;
}

一码学程 10284 排队找bug 题解 单调队列 或者 线段树RMQ的更多相关文章

  1. HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点 ...

  2. 【杂题】[CodeForces 1172F] Nauuo and Bug【数据结构】【线段树】

    Description 给出一个长度为n的序列a和一个整数p 有m组询问,每组询问给出一个区间\([l,r]\) 你需要给出下面这个过程的结果 ans = 0 for i from l to r { ...

  3. [从源码学设计]蚂蚁金服SOFARegistry之消息总线

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...

  4. [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用

    [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 定 ...

  5. [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务

    [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 0x00 摘要 0x01 业务领域 0 ...

  6. [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataServerChangeEvent及数据同步

    [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataServerChangeEvent及数据同步 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 LocalDataSe ...

  7. [从源码学设计]蚂蚁金服SOFARegistry 之 ChangeNotifier

    [从源码学设计]蚂蚁金服SOFARegistry 之 ChangeNotifier 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 ChangeNotifier 0x00 摘要 0x01 ...

  8. 海王星给你好看!FineUI v4.0公测版发布暨《你找BUG我送书》活动开始(活动已结束!)

    <FineUI v4.0 你找BUG我送书>活动已结束,恭喜如下三位网友获得由 FineUI 作者亲自翻译的图书<jQuery实战 第二版>! 奋斗~ 吉吉﹑ purplebo ...

  9. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

随机推荐

  1. 路由器安全——破解wifi密码,同时中间人攻击

    聊聊安全那些事儿 篇一:Wi-Fi安全浅析 2016-04-25 13:18:16 141点赞 712收藏 63评论 前言 近期,Wi-Fi相关的安全话题充斥着电视新闻的大屏幕,先是曝出了路由器劫持的 ...

  2. 一加5安卓P刷入twrp的recovery

    本文介绍的方法属于普适性的一般方法,比网上的各种工具箱会繁琐.但是工具箱不一定一直会更新(之前一加论坛的刷机工具箱已经停止更新了,估计是作者不用一加5了吧,毕竟已经好几年的手机了).并且如果你手机更新 ...

  3. ARTS-week7

    Algorithm 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. Two Sum 编写一个 SQL 查询,满足条件:无论 ...

  4. [BZOJ 5127][Lydsy1712月赛]数据校验

    Description 题库链接 给你一个长度为 \(n\) 的序列.\(m\) 次询问,每次询问序列的一个区间 \([l,r]\).对于 \([l,r]\) 内的所有子区间,询问值域是否连续.若存在 ...

  5. fullcalendar + qTip2显示事件详情

    fullcalendar 是一个很优秀的日历插件.qTip2 是一个强大的提示工具.在讲下面的功能之前,需要对fullcalendar 和 qTip2 有些了解,可直接点击下面贴出的2个地址: ful ...

  6. bfs与dfs小结

    1,bfs适合状态容易存储的题目,如果状态比较难存储,就难以进行记忆化搜索,必然会难以bfs. (比如听说滑雪这个题你用bfs会死得很难看) 2,但是有些题目会很深(比如网格单源最短路),用dfs会跑 ...

  7. LeetCode 1102. Path With Maximum Minimum Value

    原题链接在这里:https://leetcode.com/problems/path-with-maximum-minimum-value/ 题目: Given a matrix of integer ...

  8. 什么是uni-app?

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台. 即使不跨 ...

  9. 前端如何搭建vue UI组件库/封装插件(从零到有)

    需求 因之前是做外包项目居多,经常用到相同的组件,之前的办法是在一个项目中写一个组件,其他项目直接将compents下的组件复制,粘贴到项目中使用,缺点是维护起来,改一个项目,其他项目也需要修改,所以 ...

  10. 浅谈 Miller-Robbin 与 Pollard Rho

    前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...