結果
| 問題 |
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]);
}