結果
| 問題 |
No.448 ゆきこーだーの雨と雪 (3)
|
| ユーザー |
mkawa2
|
| 提出日時 | 2020-04-25 18:42:39 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 766 ms / 2,000 ms |
| コード長 | 2,895 bytes |
| コンパイル時間 | 111 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 78,788 KB |
| 最終ジャッジ日時 | 2024-11-07 15:47:35 |
| 合計ジャッジ時間 | 13,911 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 35 |
ソースコード
from itertools import *
from bisect import *
from collections import *
from heapq import *
import sys
sys.setrecursionlimit(10 ** 6)
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def SI(): return sys.stdin.readline()[:-1]
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
int1 = lambda x: int(x) - 1
def MI1(): return map(int1, sys.stdin.readline().split())
def LI1(): return list(map(int1, sys.stdin.readline().split()))
p2D = lambda x: print(*x, sep="\n")
dij = [(1, 0), (0, 1), (-1, 0), (0, -1)]
def main():
def ok(m):
pt = -inf
mxd = dd[m]
# Ameの最大難易度をmxdとする
# Yukiに振る仕事(難易度がmxdより大きい仕事)だけをみたとき
# 時間の間隔がk以上空いているかチェックする
for t, d in td:
if d <= mxd: continue
if t - pt < k: return False
pt = t
return True
inf = 10 ** 10
n, k = MI()
td = LLI(n)
# Ameの難易度最大値を二分探索
dd = [0] + sorted(set(d for t, d in td))
# print(dd)
l = -1
r = len(dd)
while l + 1 < r:
m = (l + r) // 2
if ok(m): r = m
else: l = m
mxd = dd[r]
print(mxd)
if r == 0:
print(0)
exit()
# Ameの最大難易度mxd以内の仕事のうち、Yukiに渡せるものをできるだけ渡す
# Yukiの確定している仕事時刻を集計
ytt = [t for t, d in td if d > mxd]
# Ameの仕事のうち、Yukiの仕事から時間がk以上離れているものを集める
# ついでにAmeの難易度合計totも計算
tot = 0
i = 0
cando = []
for t, d in td:
if d > mxd: continue
tot += d
while i < len(ytt) - 1 and t > ytt[i] + k: i += 1
if abs(t - ytt[i]) >= k: cando.append((t, d))
# candoの中から、AmeからYukiに渡す仕事の難易度合計の最大値mxを求める
# DPみたいな感じで
# 時間順に見ていって、k時間以上前の最大難易度premaxに今の難易度を足していく
premax = 0
# 処理の終わった、時刻と合計難易度をttとsdに入れていく
tt = [-inf]
sd = [0]
mx = 0
i = 0
for t, d in cando:
# 時刻tからk以上離れている合計難易度の最大値を作る
while i < len(tt) and tt[i] <= t - k:
premax = max(premax, sd[i])
i += 1
# この仕事をやるときの最大難易度cur
cur = premax + d
tt.append(t)
sd.append(cur)
mx = max(mx, cur)
# totのうちmxをYukiに渡すので、引き算するとAmeの難易度合計
print(tot - mx)
main()
mkawa2