当前位置:网站首页>【2022杭电多校5 1012题 Buy Figurines】STL的运用
【2022杭电多校5 1012题 Buy Figurines】STL的运用
2022-08-04 20:44:00 【宇智波一打七~】
题目描述

输入

输出

样例输入
1
5 3
2 4
1 3
5 1
3 4
4 2
样例输出
7
题意
有n个人去买东西,有m个窗口,每个人都有到达时间和花费时间,每个人到的时候都是挑一条人少的队排,如果有两个以上的队人最少的话就挑序号最小的队排,问多少时间的时候所有人全部买完。
思路
因为这个过程是确定性的过程,比较清晰,所以就是个模拟题,至于怎么模拟这个就需要点技巧了,如果对于每一个人都O(m)的查询每个队列的长度的话那么复杂度就太高了,所以说我们可以维护一个set,这个set里面的节点信息是每个队列的人数和标号,然后再维护一个优先队列,这个优先队列里面的每一个节点信息是时间,人的编号,出队/入队,然后是按照时间来排的,如果时间相同,那么按照先出队后入队来排,然后就是模拟的过程了,具体可以看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
typedef long long LL;
typedef pair<int,int> PII;
struct Que{
LL tim;
int id,status;
bool operator<(const Que&t)const{
if(tim == t.tim) return status > t.status;
return tim > t.tim;
}
Que(LL a=0,int b=0,int c=0):tim(a),id(b),status(c){
}
};
struct mdui{
LL num;
int id;
bool operator<(const mdui&t)const{
if(num == t.num) return id < t.id;
return num < t.num;
}
mdui(LL a=0,int b=0):num(a),id(b){
}
};
mdui q[N];
priority_queue<Que> que;
PII data[N];
set<mdui> dui;
LL last[N];
int Queselect[N];
void solve(){
dui.clear();
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&data[i].first,&data[i].second);
que.push(Que(data[i].first,i,1));
}
for(int i=1;i<=m;i++){
last[i] = 0;q[i].id = i;q[i].num = 0;
dui.insert(q[i]);
}
while(que.size()){
auto t = que.top();que.pop();
LL tim = t.tim;
int id = t.id,status = t.status;
if(t.status == 0){
int x = Queselect[id];
dui.erase(mdui(q[x].num,q[x].id));
dui.insert(mdui(--q[x].num,q[x].id));
}
else{
auto x = *dui.begin();
dui.erase(x);
if(x.num == 0) last[x.id] = tim + data[id].second;
else last[x.id] += data[id].second;
q[x.id].num ++,x.num++;
Queselect[id] = x.id;
dui.insert(x);
que.push(Que(last[x.id],id,0));
}
}
LL ans = 0;
for(int i=1;i<=m;i++) ans = max(ans,last[i]);
printf("%lld\n",ans);
}
int main(){
int _;
scanf("%d",&_);
while(_--) solve();
return 0;
}
边栏推荐
猜你喜欢

【C语言】指针和数组的深入理解(第三期)
![[Data Mining] Written Exam Questions for Sohu Data Mining Engineers](/img/d9/450eeecd5c7835d40ac38da41fc08e.png)
[Data Mining] Written Exam Questions for Sohu Data Mining Engineers

深度解析:为什么跨链桥又双叒出事了?

Oreo domain name authorization verification system v1.0.6 public open source version website source code

MATLAB中readtimetable函数用法

多用户同时远程登录连接到一台服务器

Big capital has begun to flee the crypto space?

Qt Designer生成的图形可以自适应窗口的大小变化

C#移动OA办公系统源码(基于微信企业号)

Oreo域名授权验证系统v1.0.6公益开源版本网站源码
随机推荐
Getting Started with Lattice Passwords
多商户商城系统功能拆解22讲-平台端分销商品
刷题-洛谷-P1304 哥德巴赫猜想
Latex分章节、分段落编译:input{}与include{}的区别
web漏洞扫描器-awvs
win10终端中如何切换磁盘
香港暂停进口俄罗斯部分地区禽肉及禽类产品
结构体小结
阿里的arthas使用,入门报错:Unable to attach to 32-bit process running under WOW64
密码学系列之:PEM和PKCS7,PKCS8,PKCS12
C#移动OA办公系统源码(基于微信企业号)
Retrofit的使用及原理详解
ASP.NET商贸进销存管理系统源码(带数据库文档)源码免费分享
暴雨中的人
帝国CMS仿核弹头H5小游戏模板/92game帝国CMS内核仿游戏网整站源码
【Web漏洞探索】跨站脚本漏洞
for 循环中的 ++i 与 i++
顺序队列
实现菜单拖拽排序
WIN10系统如何开启终端