結果
| 問題 |
No.580 旅館の予約計画
|
| ユーザー |
bal4u
|
| 提出日時 | 2019-08-19 19:49:38 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,979 bytes |
| コンパイル時間 | 759 ms |
| コンパイル使用メモリ | 30,848 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-04 23:20:46 |
| 合計ジャッジ時間 | 1,789 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 36 |
コンパイルメッセージ
main.c: In function 'in':
main.c:10:14: warning: implicit declaration of function 'getchar_unlocked' [-Wimplicit-function-declaration]
10 | #define gc() getchar_unlocked()
| ^~~~~~~~~~~~~~~~
main.c:16:24: note: in expansion of macro 'gc'
16 | int n = 0, c = gc();
| ^~
ソースコード
// yukicoder: No.580 旅館の予約計画
// bal4u 2019.8.19
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
//// 入出力関係
#if 1
#define gc() getchar_unlocked()
#else
#define gc() getchar()
#endif
int in() { // 非負整数の入力
int n = 0, c = gc();
do n = 10 * n + (c & 0xf); while (isdigit(c = gc()));
return n;
}
//// 優先度付きキュー
#define MAX 2000
typedef struct { int a, n; } QUE;
QUE qmi[MAX]; int qsmi;
QUE qma[MAX]; int qsma;
#define PARENT(i) ((i)>>1)
#define LEFT(i) ((i)<<1)
#define RIGHT(i) (((i)<<1)+1)
void min_heapify(int i) {
int l, r, mi;
l = LEFT(i), r = RIGHT(i);
if (l < qsmi && qmi[l].a < qmi[i].a) mi = l; else mi = i;
if (r < qsmi && qmi[r].a < qmi[mi].a) mi = r;
if (mi != i) {
QUE qt = qmi[i]; qmi[i] = qmi[mi]; qmi[mi] = qt;
min_heapify(mi);
}
}
void dmi() {
qmi[0] = qmi[--qsmi];
min_heapify(0);
}
void emi(int a, int n) {
int i, mi;
i = qsmi++;
qmi[i].a = a, qmi[i].n = n;
while (i > 0 && qmi[i].a < qmi[mi = PARENT(i)].a) {
QUE qt = qmi[i]; qmi[i] = qmi[mi]; qmi[mi] = qt;
i = mi;
}
}
void max_heapify(int i) {
int l, r, ma;
l = LEFT(i), r = RIGHT(i);
if (l < qsma && qma[l].a > qma[i].a) ma = l; else ma = i;
if (r < qsma && qma[r].a > qma[ma].a) ma = r;
if (ma != i) {
QUE qt = qma[i]; qma[i] = qma[ma]; qma[ma] = qt;
max_heapify(ma);
}
}
void dma() {
qma[0] = qma[--qsma];
max_heapify(0);
}
void ema(int a, int n) {
int i, ma;
i = qsma++;
qma[i].a = a, qma[i].n = n;
while (i > 0 && qma[i].a > qma[ma = PARENT(i)].a) {
QUE qt = qma[i]; qma[i] = qma[ma]; qma[ma] = qt;
i = ma;
}
}
//// 本問題関連
typedef struct { int tm1, tm2; int n; } T; // チェックイン、アウト時刻、id
T tbl[1005]; int m; // 予約情報、予約数
int n; // 部屋数
char ng[1005]; // 予約不能
int cmp(const void *u, const void *v) { return ((T *)u)->tm1 - ((T *)v)->tm1; } // for qsort()
int main()
{
int i, ans;
n = in(), m = in();
for (i = 1; i <= m; i++) {
tbl[i].tm1 = (in()*24 + in())*60 + in();
tbl[i].tm2 = (in()*24 + in())*60 + in() + 1;
tbl[i].n = i;
}
qsort(tbl+1, m, sizeof(T), cmp);
ans = 0;
for (i = 0; i < n; i++) emi(-200+i, 0), ema(-200+i, 0);
for (i = 1; i <= m; i++) {
// チェックアウト時刻をふたつの優先度付きキューで管理
while (ng[qmi[0].n]) dmi(); // キャンセルにした予約情報を取り除く
if (qmi[0].a <= tbl[i].tm1) { // チェックアウト時刻が最も早い予約に対し、
dmi(), ans++, emi(tbl[i].tm2, tbl[i].n), ema(tbl[i].tm2, tbl[i].n);
} else {
// 予約不能につき、チェックアウト時刻の最も遅い予約と入れ替える作業
while (ng[qma[0].n]) dma(); // キャンセルにした予約情報を取り除く
if (tbl[i].tm2 < qma[0].a) {
ng[qma[0].n] = 1, dma(); // キャンセルした!
emi(tbl[i].tm2, tbl[i].n), ema(tbl[i].tm2, tbl[i].n); // 入れ替える
}
}
}
printf("%d\n", ans);
return 0;
}
bal4u