結果
問題 | No.2325 Skill Tree |
ユーザー | InTheBloom |
提出日時 | 2023-05-28 15:29:43 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 532 ms / 3,000 ms |
コード長 | 1,653 bytes |
コンパイル時間 | 1,848 ms |
コンパイル使用メモリ | 181,464 KB |
実行使用メモリ | 45,672 KB |
最終ジャッジ日時 | 2024-06-22 18:03:26 |
合計ジャッジ時間 | 21,870 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 1 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,944 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 1 ms
6,940 KB |
testcase_07 | AC | 165 ms
11,708 KB |
testcase_08 | AC | 163 ms
13,412 KB |
testcase_09 | AC | 209 ms
12,344 KB |
testcase_10 | AC | 239 ms
24,680 KB |
testcase_11 | AC | 246 ms
13,448 KB |
testcase_12 | AC | 480 ms
27,776 KB |
testcase_13 | AC | 475 ms
26,320 KB |
testcase_14 | AC | 475 ms
26,152 KB |
testcase_15 | AC | 483 ms
26,320 KB |
testcase_16 | AC | 492 ms
26,300 KB |
testcase_17 | AC | 481 ms
26,376 KB |
testcase_18 | AC | 473 ms
26,208 KB |
testcase_19 | AC | 473 ms
26,216 KB |
testcase_20 | AC | 474 ms
26,192 KB |
testcase_21 | AC | 479 ms
26,408 KB |
testcase_22 | AC | 468 ms
26,196 KB |
testcase_23 | AC | 472 ms
26,312 KB |
testcase_24 | AC | 473 ms
26,352 KB |
testcase_25 | AC | 480 ms
27,884 KB |
testcase_26 | AC | 473 ms
26,324 KB |
testcase_27 | AC | 513 ms
45,116 KB |
testcase_28 | AC | 532 ms
44,736 KB |
testcase_29 | AC | 509 ms
45,308 KB |
testcase_30 | AC | 524 ms
44,008 KB |
testcase_31 | AC | 524 ms
45,024 KB |
testcase_32 | AC | 509 ms
44,124 KB |
testcase_33 | AC | 504 ms
45,672 KB |
testcase_34 | AC | 515 ms
45,452 KB |
testcase_35 | AC | 524 ms
43,964 KB |
testcase_36 | AC | 517 ms
45,604 KB |
testcase_37 | AC | 520 ms
44,144 KB |
ソースコード
import std; void main () { int N = readln.split[0].to!int; // 覚えるために必要な技->覚えられる技 へと有向辺を張る int[][] vertex = new int[][](N, 0); int[] L; L ~= 0; foreach (i; 1..N) { auto buf = readln.split.to!(int[]); L ~= buf[0]; buf[1] -= 1; vertex[buf[1]] ~= i; } int Q = readln.split[0].to!int; solve(N, L, vertex, Q); } void solve (int N, int[] L, int[][] vertex, int Q) { // 技i(0<=i<=N-1)を覚えるために必要なコスト -1は覚えられない(依存関係がループしている) int[] cost = new int[](N); cost[0] = 0, cost[1..$] = -1; // BFS巡回 DList!int Que; Que.insertBack(0); while (!Que.empty) { int begin = Que.front; Que.removeFront; foreach (x; vertex[begin]) { if (cost[x] == -1) { cost[x] = max(L[x], cost[begin]); Que.insertBack(x); } } } int[] merge; foreach (x; cost) { if (x != -1) { merge ~= x; } } merge.sort; foreach (_; 0..Q) { auto buf = readln.split.to!(int[]); int query = buf[0], z = buf[1]; if (query == 1) { int left = 0, right = cast(int)merge.length; while (right - left != 1) { int center = (left + right) / 2; if (z < merge[center]) { right = center; } else { left = center; } } writeln(right); } else { writeln(cost[z-1]); } } }