結果
問題 |
No.448 ゆきこーだーの雨と雪 (3)
|
ユーザー |
|
提出日時 | 2017-12-21 18:35:28 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 96 ms / 2,000 ms |
コード長 | 1,146 bytes |
コンパイル時間 | 760 ms |
コンパイル使用メモリ | 112,708 KB |
実行使用メモリ | 7,140 KB |
最終ジャッジ日時 | 2024-06-12 23:14:27 |
合計ジャッジ時間 | 5,248 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
import std.algorithm, std.conv, std.range, std.stdio, std.string; import std.typecons; // Tuple, Nullable, BigFlags void main() { auto rd = readln.split.to!(int[]), n = rd[0], k = rd[1]; auto t = new int[](n), d = new long[](n); foreach (i; 0..n) { auto rd2 = readln.splitter; t[i] = rd2.front.to!int; rd2.popFront(); d[i] = rd2.front.to!long; } auto canSolve(long x) { auto prev = -k.to!long; foreach (i; 0..n) if (d[i] > x) { if (t[i] - prev < k) { return false; } else { prev = t[i]; } } return true; } auto bsearch = iota(d.maxElement+1).map!(x => tuple(x, canSolve(x))).assumeSorted!"a[1]<b[1]"; auto dm = bsearch.upperBound(tuple(0, false)).front[0]; writeln(dm); auto dp = new long[](n+1), prev = -k.to!long; foreach (i; 0..n) { auto j = t.assumeSorted.lowerBound(t[i]-k+1).length; if (d[i] > dm) { dp[i+1] = d[i] + dp[j]; prev = t[i]; } else { if (t[i] - prev < k) { dp[i+1] = dp[i]; } else { dp[i+1] = max(dp[i], d[i] + dp[j]); } } } writeln(d.sum - dp[n]); }