結果
| 問題 |
No.59 鉄道の旅
|
| コンテスト | |
| ユーザー |
izuru_matsuura
|
| 提出日時 | 2016-11-22 23:47:59 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 143 ms / 5,000 ms |
| コード長 | 2,031 bytes |
| コンパイル時間 | 1,501 ms |
| コンパイル使用メモリ | 143,744 KB |
| 実行使用メモリ | 39,680 KB |
| 最終ジャッジ日時 | 2024-06-12 05:13:35 |
| 合計ジャッジ時間 | 3,118 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 12 |
ソースコード
import std.algorithm;
import std.array;
import std.ascii;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;
void log(A...)(A arg) {
stderr.writeln(arg);
}
int size(T)(in T s) {
return cast(int)s.length;
}
class RangeSumQuery2 {
// root縺ョindex縺ッ1
int N;
long[] V, L;
this(int N) {
import core.bitop;
this.N = 1 << (bsr(N - 1) + 1);
this.V = new long[2 * this.N];
this.L = new long[2 * this.N];
}
/* [s, t)縺ォ荳讒倥↓x繧貞刈邂・*/
void add(long x, int s, int t) { return add(x, s, t, 0, N, 1); }
void add(long x, int s, int t, int a, int b, int k) {
if (t <= a || b <= s) return;
if (s <= a && b <= t) {
L[k] += x;
return;
}
if (s < b || a < t) {
V[k] += (min(t, b) - max(s, a)) * x;
if (b - a == 1) return;
int m = (a + b) / 2;
add(x, s, t, a, m, k * 2);
add(x, s, t, m, b, k * 2 + 1);
}
}
/* [s, t)縺ョ蜥・*/
long query(int s, int t) { return query(s, t, 0, N, 1); }
long query(int s, int t, int a, int b, int k) {
if (t <= a || b <= s) return 0;
if (s <= a && b <= t) return V[k] + L[k] * (b - a);
int m = (a + b) / 2;
return (min(t, b) - max(s, a)) * L[k] +
query(s, t, a, m, k * 2) +
query(s, t, m, b, k * 2 + 1);
}
};
void main() {
int N, K;
readf("%d %d\n", &N, &K);
auto rsq = new RangeSumQuery2(1000001);
int[int] m;
foreach (i; 0 .. N) {
int W; readf("%d\n", &W);
if (W < 0) {
W = -W;
if (m.get(W, 0) == 0) continue;
rsq.add(-1, 0, W + 1);
m[W]--;
} else {
if (rsq.query(W, W + 1) >= K) continue;
m[W] = m.get(W, 0) + 1;
rsq.add(1, 0, W + 1);
}
}
writeln(rsq.query(0, 1));
}
izuru_matsuura