当时看到这道题感觉真是难过,我数据结构太弱啦。

我们来看看需要求什么:

1、当前熟了的食物的最小id

2、当前熟了的食物中有没有编号为id的食物

3、当前没熟的食物中有没有编号为id的食物

4、当前没熟的食物中编号为id的食物最接近煮熟的还需要多久才会熟

5、当前熟了的食物中编号在[l,r]之间的有多少个

我们需要维护的操作是:

1、往当前的锅里面加一个编号为id的生食物

2、每个时刻锅里面哪些生的食物要变熟

3、吃掉(删除)一个熟了的食物

感觉这种题真考人做题的毅力,求的东西好杂感觉脑子里都乱套了。

我用了4个multiset+1个树状数组来水这道题。

4个multiset:

Hn               : 存int,当前没熟的的食物的id(按照id顺序)

Hn2             : 存结构体,当前没熟的食物的id和熟的时间(按照熟的时间顺序)

now[maxn]  : 存int,now[i]是id为i的未熟食物的熟的时间(按照熟的时间顺序)

Hd               : 存int,当前熟了的食物的id(按照id顺序)

剩下还有一个树状数组用来求id在一个区间的熟了的食物的个数的。

感觉非常不优秀,但是当时剩下时间不多,就没有怎么优化。

注意multiset如果直接erase(x)会把所有值为x的都删掉,只删一个需要先find,再删。(感谢Achen)

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
const int maxn=1e5+10,maxm=5e5+10;
int n,m,T,s[maxn]; struct Node{
int id,time;
Node() {}
Node(int id,int time):id(id),time(time){}
bool operator < (const Node& b) const{
return time < b.time;
}
}; multiset<int> Hn;
multiset<Node> Hn2;
multiset<Node>::iterator it;
multiset<int>::iterator it2;
multiset<int> Hd;
multiset<int> now[maxn]; int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} int sz[maxn];
void chge(int pos,int x) {
while(pos<=n) {
sz[pos]+=x;
pos+=pos&-pos;
}
} int q(int pos) {
int rs=0;
while(pos) {
rs+=sz[pos];
pos-=pos&-pos;
}
return rs;
} int main() {
T=read(); int t,op,l,r,x;
while(T--) {
Hn.clear(); Hn2.clear(); Hd.clear();
for(int i=1;i<=n;++i) now[i].clear();
memset(sz,0,sizeof(sz));
n=read();
for(int i=1;i<=n;++i) s[i]=read();
m=read();
while(m--) {
t=read(); op=read();
while(!Hn2.empty()) {
it=Hn2.begin();
if(it->time>t) break;
x=it->id;
it2=Hn.find(x);
Hn.erase(it2);
Hd.insert(x);
Hn2.erase(it);
chge(x,1);
while(!now[x].empty()) {
it2=now[x].begin();
if(*it2>t) break;
now[x].erase(it2);
}
}
if(op==0) {
x=read();
Hn2.insert(Node(x,t+s[x]));
Hn.insert(x);
now[x].insert(t+s[x]);
}
else if(op==1) {
if(Hd.empty()) {
printf("Yazid is angry.\n");
continue;
}
it2=Hd.begin();
printf("%d\n",*it2);
chge(*it2,-1);
Hd.erase(it2);
}
else if(op==2) {
x=read();
if((it2=Hd.find(x))!=Hd.end()) {
printf("Succeeded!\n");
chge(*it2,-1);
Hd.erase(it2);
}
else if(Hn.find(x)!=Hn.end()) {
it2=now[x].begin();
printf("%d\n",*it2-t);
}
else printf("YJQQQAQ is angry.\n");
}
else if(op==3) {
l=read(); r=read();
printf("%d\n",q(r)-q(l-1));
}
}
}
return 0;
}

  

CodePlus2017 12月月赛 div2火锅盛宴的更多相关文章

  1. CodePlus2017 12月月赛 div2可做题2

    11月的月赛错过了,来打12月月赛,由于很(zi)想(ji)拿(tai)衣(ruo)服(la),所以去打div2. T1是一个sb模拟,但是机房全卡死在这道语文题上了,基本上弄了一个半小时,T2可以秒 ...

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

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

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

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

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

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

  5. 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)

    由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...

  6. CSU 2018年12月月赛 B 2214: Sequence Magic

    Description 有一个1到N的自然数序列1,2,3,...,N-1,N. 我们对它进行M次操作,每次操作将其中连续的一段区间 [Ai,Bi][Ai,Bi] (即第Ai个元素到第Bi个元素之间的 ...

  7. 最大字段和&洛谷11月月赛DIV2 T1

    蒟蒻只能打一打DIV2的基础题 太卑微了 这道题的本质其实是再建一个数组,如果s串i位置是0那么就给a[i]赋值为1,表示要累加个数,如果是1那么就把a[i]赋值为-1,表示个数减一,最后求最大子段和 ...

  8. 安恒X计划12月月赛

    ezweb 主要是序列化问题.没有PHP环境,在线运行的.实例化对象之后修改一下file.然后echo输出序列化的结果.不过下面有一个正则检查.数字前加一个+,影响了正则的匹配,但是对于序列化的还原没 ...

  9. CSU 2018年12月月赛 H(2220): Godsend

    Description Leha somehow found an array consisting of n integers. Looking at it, he came up with a t ...

随机推荐

  1. Leetcode937. Reorder Log Files重新排列日志文件

    你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写字母组成,或: 标识符后面的每个字将仅由数字组成. 我们 ...

  2. linux系统下重要的分区及其作用

    下面列出来的是linux系统下重要的分区及其作用/bin :bin是binary的缩写;/boot :存放启动Linux时使用的一些核心文件;/root :root(超级管理员)的用户主目录;/sbi ...

  3. SQL的特点

    1.综合统一 2.高度非过程化 3.面向集合的操作方式 4.一同一种语法结构提供两种使用5.语言简洁易学易用

  4. location.hash的不一样用法

    除了可以当做锚点,定位到同name位置,location.hash还有两个用法. 平时开发都会用得到. 一:使js事件在浏览器中产生历史记录. 举个栗子: 我们在JS里面改变了页面的数据.样式等,比如 ...

  5. C# 窗体内容显示不全

    在T430上安装skyline的CS版时候,发现登陆窗口显示的内容不全,第二个缓冲的窗口也显示不全.设置了下面的参数后就可以了.

  6. WIX、Squarespace、WordPress 三者的优劣分别是什么?

    层出不穷的智能建站,模板建站,源码建站,云建站,仿站,各种建站概念都抛洒于红海之中.到底什么样的网站适合自己,什么样的网站值得我们去消费,什么样的网站能长久,是个非常值得思考的问题. 网站建设技术非常 ...

  7. CentOS 6.5 MySQL安装

    yum search mysql #查看mysql包 yum -y install mysql-server #安装mysql,注意是mysql-server iptables -I INPUT -p ...

  8. Oracle时间日期处理方法

    https://www.cnblogs.com/plmm/p/7381496.html 1.用于截取年.月.日.时.分.秒 extract()函数 extract(year from sysdate) ...

  9. 使用 windows 批处理指令(BAT文件)进行文件删除、复制操作

    以下是做文件删除和复制的批处理指令 ::替换文件需要添加 /y 参数才能直接替换.不然会出现提示是否替换. ::复制Axis2Implementation和WebServices编译后的文件到tomc ...

  10. 使用alibaba的json工具将String类型转为JSONArray类型

    转化流程:先将输入流转为String类型,再使用alibaba的json转换工具,将字符串转化为json数组 SensorDevices sensorDevices = new SensorDevic ...