結果
問題 | No.1950 片道きゃっちぼーる |
ユーザー | tomerun |
提出日時 | 2022-05-20 22:24:04 |
言語 | Crystal (1.11.2) |
結果 |
AC
|
実行時間 | 290 ms / 3,000 ms |
コード長 | 1,452 bytes |
コンパイル時間 | 12,215 ms |
コンパイル使用メモリ | 296,576 KB |
実行使用メモリ | 55,664 KB |
最終ジャッジ日時 | 2024-09-20 08:38:52 |
合計ジャッジ時間 | 18,147 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 1 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 188 ms
55,664 KB |
testcase_04 | AC | 171 ms
40,572 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 151 ms
53,856 KB |
testcase_07 | AC | 128 ms
42,012 KB |
testcase_08 | AC | 131 ms
40,044 KB |
testcase_09 | AC | 168 ms
45,204 KB |
testcase_10 | AC | 157 ms
48,224 KB |
testcase_11 | AC | 151 ms
48,048 KB |
testcase_12 | AC | 153 ms
47,992 KB |
testcase_13 | AC | 174 ms
47,872 KB |
testcase_14 | AC | 164 ms
41,600 KB |
testcase_15 | AC | 290 ms
54,016 KB |
testcase_16 | AC | 166 ms
46,976 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 165 ms
47,488 KB |
testcase_19 | AC | 276 ms
52,864 KB |
testcase_20 | AC | 132 ms
38,528 KB |
testcase_21 | AC | 171 ms
46,976 KB |
testcase_22 | AC | 149 ms
42,368 KB |
ソースコード
n = read_line.to_i x = read_line.split.map(&.to_i) a = read_line.split.map(&.to_i) g = Array.new(n) { [] of Int32 } g_rev = Array.new(n) { [] of Int32 } pos = Hash(Int32, Int32).new n.times do |i| pos[x[i]] = i end n.times do |i| if pos.has_key?(x[i] - a[i]) g_rev[pos[x[i] - a[i]]] << i g[i] << pos[x[i] - a[i]] end if pos.has_key?(x[i] + a[i]) g_rev[pos[x[i] + a[i]]] << i g[i] << pos[x[i] + a[i]] end end stack = [] of Int32 visited = Array.new(n, false) n.times do |i| scc_dfs(g, stack, visited, i) end visited.fill(false) groups = [] of Array(Int32) stack.reverse.each do |i| next if visited[i] group = [] of Int32 scc_dfs_rev(g_rev, group, visited, i) groups << group end def scc_dfs(g, stack, visited, cur) return if visited[cur] visited[cur] = true g[cur].each do |c| scc_dfs(g, stack, visited, c) end stack << cur end def scc_dfs_rev(g_rev, list, visited, cur) return if visited[cur] visited[cur] = true g_rev[cur].each do |c| scc_dfs_rev(g_rev, list, visited, c) end list << cur end ans = Array.new(n, 0) groups.reverse.each do |group| max = 0 group.each do |i| max = {max, x[i] + a[i]}.max if pos.has_key?(x[i] + a[i]) max = {max, ans[pos[x[i] + a[i]]]}.max end if pos.has_key?(x[i] - a[i]) max = {max, ans[pos[x[i] - a[i]]]}.max end end group.each do |i| ans[i] = max end end puts n.times.map { |i| ans[i] - x[i] }.join("\n")