CodePlus2017 12月月赛 div2火锅盛宴

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

我们来看看需要求什么:

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;
}

  

原文地址:https://www.cnblogs.com/Serene-shixinyi/p/8111331.html

时间: 2024-10-09 15:14:10

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

USACO银组12月月赛题解

USACO银组12月月赛题解 Convention 题面 一场别开生面的牛吃草大会就要在Farmer John的农场举办了! 世界各地的奶牛将会到达当地的机场,前来参会并且吃草.具体地说,有N头奶牛到达了机场(1≤N≤105),其中奶牛i在时间ti(0≤ti≤109)到达.Farmer John安排了M(1≤M≤105)辆大巴来机场接这些奶牛.每辆大巴可以乘坐C头奶牛(1≤C≤N).Farmer John正在机场等待奶牛们到来,并且准备安排到达的奶牛们乘坐大巴.当最后一头乘坐某辆大巴的奶牛到达的

「CodePlus 2017 12 月赛」火锅盛宴

n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食,如果有熟食删除之,否则输出其离煮熟的最小时间:查询编号在[L,R]的熟食有多少.保证操作时间递增. 可以发现:针对某种食物的信息维护只需要知道其未煮熟的食物中煮熟时间的最小值,而所有的熟食都可以一起维护.为此可以:对每个食物开个队列存未熟食物,对所有食物开个优先队列以便及时把熟食从队列中提出来,并开个以编号为

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

1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟时间<=当前时间的弹出,BIT上+1. 每次0操作把食物塞进优先队列和vector 每次1操作先看看树状数组里有没有数,没有输出angry,有的话在树状数组上二分找到最小的数. 每次2操作先看看树状数组里有没有这一种数,有的话输出并-1,没有的话看看vector有没有,有的话输出时间差,没有的话输出

大数据技术人年度盛事! BDTC 2016将于12月8-10日在京举行

2016年12月8日-10日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所和CSDN共同协办的2016中国大数据技术大会(Big Data Technology Conference 2015,BDTC 2016)将在北京新云南皇冠假日酒店隆重举办. 图片描述 中国大数据技术大会(BDTC)的前身是Hadoop中国云计算大会(Hadoop in China,HiC).从2008年仅60余人参加的技术沙龙到当下数千人的技术盛宴,目前已成为国内最具影响力.规模

【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力.小Q同学

4832: [Lydsy2017年4月月赛]抵制克苏恩]【解题报告】

戳我 4832: [Lydsy2017年4月月赛]抵制克苏恩 时间限制: 1 Sec  内存限制: 128 MB提交: 752  解决: 289[提交][][] 题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力.小Q同学有很多次游戏失败都是 因为对手使用

csu-2018年11月月赛Round2-div1题解

csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党,所以每次只能取出一块积木放在积木顶层 现在Wells想知道至少需要操作几次可以把积木堆成从顶至底标号升序 不论什么都很菜的Wells显然不知道怎么做 所以作为人生赢家的你义不容辞的决定帮助可怜的Wells Input 第一行一个正整数N 接下来N行,从顶至底描述每块积木的标号 Output 输出一行

蔡康永的说话之道——2019年12月15日

.bodyContainer { font-family: Arial, Helvetica, sans-serif; text-align: center; padding-left: 32px; padding-right: 32px; } .notebookFor { font-size: 18px; font-weight: 700; text-align: center; color: rgb(119, 119, 119); margin: 24px 0px 0px; padding:

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数

七月算法--12月机器学习在线班-第三次课笔记—矩阵和线性代数 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com