結果
問題 |
No.3238 Shadow
|
ユーザー |
![]() |
提出日時 | 2025-08-15 22:21:17 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 362 ms / 2,000 ms |
コード長 | 1,751 bytes |
コンパイル時間 | 10,813 ms |
コンパイル使用メモリ | 309,704 KB |
実行使用メモリ | 18,044 KB |
最終ジャッジ日時 | 2025-08-15 22:21:40 |
合計ジャッジ時間 | 14,072 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
n = read_line.to_i p = read_line.split.map(&.to_i) rev = Array.new(n + 1, 0) n.times { |i| rev[p[i]] = i } st = SegTree(Int32).new(p, ->(a : Int32, b : Int32) { {a, b}.min }, n + 1) while true right = n min_x = n min_y = n while right > 0 min = st.get(0, right) break if min == n + 1 min_x = {min_x, rev[min]}.min min_y = {min_y, min}.min right = rev[min] st.set(rev[min], n + 1) end break if min_x == n puts "#{min_x + 1} #{min_y}" end class SegTree(T) @ar : Array(T) @size : Int32 @op : Proc(T, T, T) @zero : T def initialize(s : Int32, @op : Proc(T, T, T), @zero : T) @size = 1 while @size < s @size *= 2 end @ar = Array.new(@size * 2, @zero) end def initialize(init : Array(T), @op : Proc(T, T, T), @zero : T) @size = 1 while @size < init.size @size *= 2 end @ar = Array.new(@size, @zero) @ar.concat(init) @ar.concat([@zero] * (@size - init.size)) (@size - 1).downto(1) do |i| @ar[i] = @op.call(@ar[i * 2], @ar[i * 2 + 1]) end end def get(lo : Int32, hi : Int32) ret = @zero bit = 1 base = @size while lo < hi if (lo & ((1 << bit) - 1)) != 0 ret = @op.call(ret, @ar[base + (lo >> (bit - 1))]) lo += 1 << (bit - 1) end if (hi & ((1 << bit) - 1)) != 0 ret = @op.call(ret, @ar[base + (hi >> (bit - 1)) - 1]) hi -= 1 << (bit - 1) end bit += 1 base >>= 1 end return ret end def set(pos : Int32, v : T) base = @size @ar[base + pos] = v pos >>= 1 base >>= 1 while base > 0 @ar[base + pos] = @op.call(@ar[base * 2 + pos * 2], @ar[base * 2 + pos * 2 + 1]) pos >>= 1 base >>= 1 end end end