結果
| 問題 |
No.448 ゆきこーだーの雨と雪 (3)
|
| ユーザー |
|
| 提出日時 | 2016-11-17 16:14:32 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 1,360 ms / 2,000 ms |
| コード長 | 2,897 bytes |
| コンパイル時間 | 3,790 ms |
| コンパイル使用メモリ | 78,320 KB |
| 実行使用メモリ | 74,792 KB |
| 最終ジャッジ日時 | 2024-12-22 23:59:36 |
| 合計ジャッジ時間 | 36,924 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 35 |
ソースコード
package yukicoder;
import java.util.*;
public class Q448 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
int[] T = new int[N];
int[] D = new int[N];
int max = -1;
for (int i = 0; i < N; ++i) {
T[i] = sc.nextInt();
D[i] = sc.nextInt();
max = Math.max(max, D[i]);
}
int left = -1;
int right = max;
outer: while (right - left > 1) {
int middle = (left + right) / 2;
int preTime = -K;
for (int i = 0; i < N; ++i) {
if (D[i] > middle) {
if (T[i] - preTime < K) {
left = middle;
continue outer;
} else
preTime = T[i];
}
}
right = middle;
}
max = right;
System.out.println(max);
SegTree seg = new SegTree(N);
int preTime = -K;
for (int i = 0; i < N; ++i) {
if (D[i] <= max) {
long opt = Math.max(seg.query(binarySearchUpper(T, preTime + K), binarySearchLower(T, T[i] - K) + 1),
seg.query(binarySearchLower(T, preTime), binarySearchLower(T, preTime) + 1));
seg.setVal(i, opt + D[i]);
} else {
seg.setVal(i,
Math.max(seg.query(binarySearchUpper(T, preTime + K), binarySearchLower(T, T[i] - K) + 1),
seg.query(binarySearchLower(T, preTime), binarySearchLower(T, preTime) + 1)));
preTime = T[i];
}
}
long sum = 0;
for (int i = 0; i < N; ++i) {
if (D[i] <= max)
sum += D[i];
}
System.out.println(sum - Math.max(seg.query(binarySearchLower(T, preTime), binarySearchLower(T, preTime) + 1),
seg.query(binarySearchUpper(T, preTime + K), N)));
}
static int binarySearchLower(int[] a, int key) {
int left = -1;
int right = a.length;
while (right - left > 1) {
int middle = (right + left) / 2;
if (key >= a[middle]) {
left = middle;
} else {
right = middle;
}
}
return left;
}
static int binarySearchUpper(int[] a, int key) {
int left = -1;
int right = a.length;
while (right - left > 1) {
int middle = (right + left) / 2;
if (key <= a[middle]) {
right = middle;
} else {
left = middle;
}
}
return right;
}
static class SegTree {
int n = 1;
long[] max;
public SegTree(int n_) {
while (n < n_) {
n *= 2;
}
max = new long[2 * n - 1];
}
void setVal(int k, long val) {
k += n - 1;
max[k] = val;
while (k > 0) {
k = (k - 1) / 2;
max[k] = Math.max(max[2 * k + 1], max[2 * k + 2]);
}
}
long query(int a, int b) {
return query(a, b, 0, n, 0);
}
long query(int a, int b, int l, int r, int k) {
if (a >= r || b <= l) {
return 0;
} else if (a <= l && r <= b) {
return max[k];
} else {
long vl = query(a, b, l, (l + r) / 2, 2 * k + 1);
long vr = query(a, b, (l + r) / 2, r, 2 * k + 2);
return Math.max(vl, vr);
}
}
}
static void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
}