結果
| 問題 |
No.3238 Shadow
|
| コンテスト | |
| ユーザー |
tomerun
|
| 提出日時 | 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
tomerun