prologue

树状数组推荐写法,感谢巨佬樱雪喵的教学。


inline int lowbit(int x)
{
return x & -x;
} inline void add(int x, int c)
{
for(; x <= n; x += lowbit(x)) tr[x] += c;
} inline int sum(int x)
{
int res = 0;
for(; x; x -= lowbit(x)) res += tr[x];
return res;
}

analysis

很弱的模拟题?

这个题目主要解决的问题就以下几个:

  1. 对于 YJQQQAQ 怎么快速的查询和删除它要吃掉的东西。
  2. 怎么维护东西熟了没熟(不干不净吃了没病?)
  3. 维护一个区间里面的和。

我们可以想到,关于时间类型的问题,它必定是顺着时间进行的(废话但是有用),不太可能出现时间倒流(某些图论题存下来离线,倒序处理除外)。那么我们就可以用时间这一维度来搞个优先队列,然后对于每一个新输入的时间,就来处理这个锅里面的东西是不是已经做好了。

我们又注意到,Yazid 这个人很喜欢吃编号小的食物,所以我们就可以选择用另外一个优先队列来存储这些已经做好的食物。

我们还要处理怎么解决 YJQQQAQ 的问题。我们可以给每种食物开一个结构体,里面存一个队列和一个 cnt。队列用来存还没有煮熟的吃的, cnt 用来存现在做好的还没有被吃了的食物有多少。

对于一个区间的和我们可以采用线段树或者树状数组。因为树状数组的时间、空间都要优于线段树。所以我就用树状数组实现了(主要是懒的敲线段树了。

剩下的就貌似是一个比较大的模拟题了。(

code time

(之前调上面树状数组那一块一直没调出来,然后压了点行。)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define wl putchar('\n')
#define ws putchar(' ') template <class T> inline void read(T &res)
{
char ch; bool f = 0;
while((ch = getchar()) < '0' || ch > '9') f |= ch == '-';
res = ch ^ 48;
while((ch = getchar()) <= '9' && ch >= '0') res = (res << 1) + (res << 3) + (ch ^ 48);
res = f ? ~res + 1 : res;
} inline void ww(ll x)
{
if(x < 0) x = ~x + 1, putchar('-');
if(x > 9) ww(x / 10);
putchar(x % 10 ^ 48);
} const ll N = 1e5 + 10; ll n, m, eat[N], s[N], tr[N]; struct node
{
ll id, time;
bool operator <(const node &x) const
{
return time > x.time;
}
}; struct pot
{
ll cnt;
queue<ll> T;
inline void clean()
{
cnt = 0;
while(T.size()) T.pop();
}
}pot[N]; priority_queue<node> q;
priority_queue<ll> ripe; inline ll lowbit(ll x)
{
return x & -x;
} inline void add(ll x, ll c)
{
for(; x <= n; x += lowbit(x)) tr[x] += c;
} inline ll sum(ll x)
{
ll res = 0;
for(; x; x -= lowbit(x)) res += tr[x];
return res;
} int main()
{
// freopen("1.in", "r", stdin), freopen("1.out", "w", stdout); ll T; read(T);
while(T -- )
{
read(n);
while(q.size()) q.pop(); while(ripe.size()) ripe.pop();
for(rl i=1; i <= n; ++ i)
{
read(s[i]);
eat[i] = 0;
pot[i].clean();
tr[i] = 0;
} read(m);
while(m -- )
{
ll t, op, a, b;
read(t), read(op); while(q.size() && q.top().time <= t)
{
ll id = q.top().id;
add(id, 1); pot[id].cnt ++ ; pot[id].T.pop();
ripe.push(-id); q.pop();
} if(op == 0) { read(a), q.push({a, t + s[a]}), pot[a].T.push(t + s[a]); }
else if(op == 1)
{
ll id = -1;
while(ripe.size())
{
ll x = -ripe.top();
ripe.pop();
if(eat[x] > 0) -- eat[x];
else
{
id = x;
break;
}
} if(id == -1) puts("Yazid is angry.");
else ww(id), add(id, -1), -- pot[id].cnt, wl;
}
else if(op == 2)
{
read(a);
if(pot[a].cnt)
{
-- pot[a].cnt; add(a, -1); ++ eat[a];
puts("Succeeded!");
}
else
{
if(pot[a].T.size()) ww(pot[a].T.front() - t), wl;
else puts("YJQQQAQ is angry.");
}
}
else
{
read(a), read(b);
ww(sum(b) - sum(a - 1)), wl;
}
}
}
return 0;
}

P4032 [Code+#2] 火锅盛宴的更多相关文章

  1. code+12月月赛 火锅盛宴

    时间限制: 2.0 秒 空间限制: 512 MB 题目背景 SkyDec和YJQQQAQ都是Yazid的好朋友.他们都非常喜欢吃火锅.有一天,他们聚在一起,享受一场火锅盛宴. 题目描述 在这场火锅盛宴 ...

  2. 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)

    1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ...

  3. 「CodePlus 2017 12 月赛」火锅盛宴

    n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食, ...

  4. CodePlus2017 12月月赛 div2火锅盛宴

    当时看到这道题感觉真是难过,我数据结构太弱啦. 我们来看看需要求什么: 1.当前熟了的食物的最小id 2.当前熟了的食物中有没有编号为id的食物 3.当前没熟的食物中有没有编号为id的食物 4.当前没 ...

  5. bzoj5000+的洛谷题号

    前言 闲得没事把 bzoj5000+ 在 Luogu 上可找到的题面整理了一下-- 对于我,bzoj 连账号都没有,所以肯定是不清楚 bzoj 题目总数的--因此其实就是手动翻查. 工作量很大,基本不 ...

  6. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  7. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  8. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

  9. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  10. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

随机推荐

  1. IDEA连接数据库

    我只想卷死各位,或者被各位卷死 在入门案例映射配置文件中存在报红的情况.问题如下: 产生的原因:Idea和数据库没有建立连接,不识别表信息.但是大家一定要记住,它并不影响程序的执行. 解决方式:在Id ...

  2. React后台管理系统11 配置项目初始化展开代码

    在上一文中,我们已经配置好了,刷新默认打开选中的样式,但是如果是在/page3/1,这种的,并没有选中到/page3里面的/page3/1,这个地方来,所以我们需要解决的就是这几个问题: 思路如下: ...

  3. 多个commit合并为一个

    在进行多个commit合并成一个博客编写的过程中,你可以使用以下代码示例作为参考: # 合并多个commit git rebase -i HEAD~N # N代表需要合并的commit数目,例如合并最 ...

  4. "Process finished with exit code 1" 进程结束

    问题描述 :  springboot     程序运行出现以下情况 没有错误日志  返回运行结束 状态码  1     状态码为 1 的时候表示程序不是异常终止 连接到目标VM, 地址: ''127. ...

  5. 强化学习实践:Policy Gradient-Cart pole游戏展示

    摘要:智能体 agent 在环境 environment 中学习,根据环境的状态 state(或观测到的 observation),执行动作 action,并根据环境的反馈 reward(奖励)来指导 ...

  6. Java版人脸跟踪三部曲之二:开发设计

    如何开发Java版人脸跟踪应用?本篇给出了设计大纲,并解释了相关的重要知识点 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599 ...

  7. 即构携手智能对讲机品牌Runbo,打造可视化对讲通信系统

    现代通信技术的发展,让信息的传递变得前所未有的便捷.作为双向移动通信工具,对讲机不需要网络支持就可以进行通话,且没有话费产生,尤其适合酒店.物业等使用区域固定.通话频繁的场景. 随着技术的不断迭代,对 ...

  8. stegsolve与zsteg的使用

    zsteg 介绍:用来检测PNG和BMP中隐藏数据的工具,可以快速提取隐藏信息 使用环境:kali kali自带zsteg,可以用这个指令使用 gem install zsteg 下载完之后查看使用方 ...

  9. WebSSH远程管理Linux服务器、Web终端窗口自适应(二)

    上一篇:Gin+Xterm.js实现WebSSH远程Kubernetes Pod 支持用户名密码认证 支持SSH密钥认证 支持Web终端窗口自适应 支持录屏审计 Go SSH golang.org/x ...

  10. linux程序开机自动运行-未解决

    愚认为,本质上就是把程序放在etc文件目录下,让系统开机时,把程序一起编译运行了.orz 首先可以写个shell脚本如下: #!/bin/bash # 定义需要按顺序启动的 Python 程序列表 P ...