hihoCoder 1401 Registration
多队列模拟. 与POJ #1025 Department类似, 不过简化很多. 貌似这类模拟题经常出现. 用STL中的优先队列 (priority_queue<>) 很好写.
这题我写得很不顺, 老年选手退步太快, 记录一下我犯的一个很隐蔽的错误, 从前对此毫无认识, 想想都可怕, 太菜了.
这道题优先队列里维护的事件 (event) 是等待.
释放这些等待的先后顺序如下:
在同一队列 (此"队列"指某个office门前的队列, 与"优先队列"中的"队列"含义不同;下同) 中的两个事件, 按(开始等待时刻, 学号)这两个关键字排序. 在不同队列中的两事件按开始等待的时刻排序.
思路是比较容易想到的. 但我的实现里有个很subtle的错误.
Wrong implementation
#include <bits/stdc++.h>
using namespace std;
const int N{1<<14}, M{1<<7};
int s[N], res[N];
vector<pair<int,int>> r[N]; // registration
int avail[M];
int n, m, k;
struct W{
int id, beg, idx;
int des()const{
return r[id][idx].first;
}
int dur()const{
return r[id][idx].second;
}
int num()const{
return s[id];
}
int end()const{
return max(beg, avail[des()])+dur(); // error-prone
}
W next(){
return {id, end()+k, idx+1};
}
void out(){
cout<<id<<' '<<beg<<' '<<idx<<' '<<avail[des()]<<endl;
}
};
// greater<_Tp> is a function object
// constexpr std::greater<_Tp>::operator()(const _Tp &, const_Tp &)const
bool cmp(const W &a, const W &b){ //! > must be a const
if(a.des()!=b.des()){
return a.beg>b.beg;
}
else{
return a.beg!=b.beg?a.beg>b.beg:a.num()>b.num();
}
}
priority_queue<W, vector<W>, decltype(cmp)*> que(cmp);
int main(){
cin>>n>>m>>k;
for(int i=0; i<n; i++){
int q, t;
cin>>s[i]>>t>>q;
for(; q--; ){
int o, t;
cin>>o>>t;
r[i].push_back({o, t});
}
que.push({i, t+k, 0});
}
for(; !que.empty(); ){
W top=que.top();
que.pop();
if(top.idx<r[top.id].size()-1){
que.push(top.next());
}
else{
res[top.id]=top.end();
}
avail[top.des()]=top.end();
}
for(int i=0; i<n; i++)
cout<<res[i]<<endl;
return 0;
}
注意其中的比较函数cmp:
bool cmp(const W &a, const W &b){ //! > must be a const
if(a.des()!=b.des()){
return a.beg>b.beg;
}
else{
return a.beg!=b.beg?a.beg>b.beg:a.num()>b.num();
}
}
首先必须认识到: 优先队列要求元素的键值 (key) 在所定义的比较函数下是全序的 (totally ordered).
If $X$ is totally ordered under $\le$, then the following statements hold for all $a, b$ and $c$ in $X$:
if $a \le b$ and $b \le a$ then $ a=b$ (antisymmetry);
if $a \le b$ and $b\le c$ then $a \le c$ (transitivity);
$a \le b$ or $b \le a$ (totality).
我所定义的比较函数并不是全序的. 问题中的集合$X$内的元素是一个三元组$(id, des, time)$. 我们定义的比较函数cmp是一个strict weak ordering (<). 这个binary relation应当满足
if $a < b$ and $b<c$, then $a<c$
$a< b$ or $ b<a$ or $a=b$.
但是据此会导出矛盾, 考虑
$a =(id_1, des_1, t), b=(id_2, des_1, t), c=(id_3, des_2, t), id_1 < id_2 \Longrightarrow a > b, a=c, b=c$.
矛盾!
因而这个比较函数不是全序的.
但是可以略微改一下:
以$time$为第一关键字, $des$为第二关键字, $id$为第三关键字.
这样不但思路更清楚, 代码也可以简化
Implementation
#include <bits/stdc++.h>
using namespace std;
const int N{1<<14}, M{1<<7};
int s[N], res[N];
vector<pair<int,int>> r[N]; // registration
int avail[M];
int n, m, k;
struct W{
int id, beg, idx;
int des()const{
return r[id][idx].first;
}
int dur()const{
return r[id][idx].second;
}
auto make_tuple()const{
return std::make_tuple(beg, des(), num());
}
int num()const{
return s[id];
}
bool operator<(const W &rhs)const{
return make_tuple() > rhs.make_tuple();
}
int end()const{
return max(beg, avail[des()])+dur(); // error-prone
}
W next(){
return {id, end()+k, idx+1};
}
void out(){
cout<<id<<' '<<beg<<' '<<idx<<' '<<avail[des()]<<endl;
}
};
priority_queue<W> que;
int main(){
cin>>n>>m>>k;
for(int i=0; i<n; i++){
int q, t;
cin>>s[i]>>t>>q;
for(; q--; ){
int o, t;
cin>>o>>t;
r[i].push_back({o, t});
}
que.push({i, t+k, 0});
}
for(; !que.empty(); ){
W top=que.top();
que.pop();
if(top.idx<r[top.id].size()-1){
que.push(top.next());
}
else{
res[top.id]=top.end();
}
avail[top.des()]=top.end();
}
for(int i=0; i<n; i++)
cout<<res[i]<<endl;
return 0;
}
hihoCoder 1401 Registration的更多相关文章
- struts2启动报错:ERROR com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor - Conversion registration error
[framework] 2019-12-05 11:34:05,441 - org.springframework.web.context.ContextLoader -5352 [RMI TCP C ...
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II
http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
- 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切
题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词 代码注意点: 1. getline(istre ...
随机推荐
- 关于用mybatis调用存储过程时的入参和出参的传递方法
一.问题描述 a) 目前调用读的存储过程的接口定义一般是:void ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...
- stringstream的用法【转】
[本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...
- sql基本命令
--------------------------------------------------------SQL基本命令开始----------------------------------- ...
- 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...
- <实训|第八天>超级管理员管理linux用户行为权限附监控主机状态
作为运维工程师,系统管理员,你最大的权力就是给别人分配权力,而且你还能时时控制着他们,今天就给大家介绍一下关于管理用户这一方面的前前后后. 开班第八天: 主要课程大纲:(下面我将把自己的身份定位成一 ...
- Mininet的内部实现原理简介
原文发表在我的博客主页,转载请注明出处. 前言 之前模拟仿真网络一直用的是Mininet,包括写了一些关于Mininet安装,和真实网络相连接,Mininet简历拓扑的博客,但是大多数都是局限于具体步 ...
- Android实现滑动刻度尺效果,选择身高体重和生日
刻度尺效果虽然看起来很美,我个人认为很不实用,即使再不实用,也有用的,鉴于群里成员对我的苦苦哀求,我就分享一个他用不到的,横屏滑动刻度尺,因为他需要竖屏的,哈哈…… 最近群里的开发人员咨询怎样实现刻度 ...
- js的几种排序
转载:http://www.jb51.net/article/81520.htm 一.冒泡排序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记
一.课程简介: text mining and analytics 是一门在coursera上的公开课,由美国伊利诺伊大学香槟分校(UIUC)计算机系教授 chengxiang zhai 讲授,公开课 ...
- JavaScript学习笔记- 正则表达式常用验证
<div> <h1>一.判断中国邮政编码匹配</h1> <p>分析:中国邮政编码都是6位,且为纯数字</p> <div>邮政编码 ...