結果
| 問題 |
No.1095 Smallest Kadomatsu Subsequence
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-11-05 08:10:11 |
| 言語 | Ruby (3.4.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,278 bytes |
| コンパイル時間 | 123 ms |
| コンパイル使用メモリ | 7,424 KB |
| 実行使用メモリ | 54,384 KB |
| 最終ジャッジ日時 | 2024-10-15 16:18:12 |
| 合計ジャッジ時間 | 8,299 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 TLE * 1 -- * 9 |
コンパイルメッセージ
Syntax OK
ソースコード
class SegmentTree
def initialize(arr)
@h = (arr.length - 1).bit_length
@n = 2**@h
@ie = Float::INFINITY
@tree = Array.new(2*@n, @ie)
0.upto(arr.length-1) {|i|
@tree[@n + i] = arr[i]
}
(@n-1).downto(1) {|i|
@tree[i] = [@tree[2 * i], @tree[2 * i + 1]].min
}
end
def set(idx, x)
idx += @n
@tree[idx] = x
while idx > 0 do
idx >>= 1
@tree[idx] = [@tree[2 * idx], @tree[2 * idx + 1]].min
end
end
def query(lt, rt)
lt += @n
rt += @n
vl = vr = @ie
while rt - lt > 0 do
if lt & 1 != 0 then
vl = [vl, @tree[lt]].min
lt += 1
end
if rt & 1 != 0 then
rt -= 1
vr = [@tree[rt], vr].min
end
lt >>= 1
rt >>= 1
end
[vl, vr].min
end
end
INF = Float::INFINITY
N = gets.to_i
A = gets.split(" ").map{|s| s.to_i}
S = A.map.with_index{|x, i| [x, i]}.sort_by!{|x| x[0]}
res = INF
st1 = SegmentTree.new([INF] * N)
0.upto(N-1) {|i|
a, idx = S[i]
st1.set(idx, a)
lt = st1.query(0, idx)
rt = st1.query(idx + 1, N)
next if lt == INF or rt == INF
res = [res, lt + rt + a].min
}
st2 = SegmentTree.new([INF] * N)
(N-1).downto(0) {|i|
a, idx = S[i]
st2.set(idx, a)
lt = st2.query(0, idx)
rt = st2.query(idx + 1, N)
next if lt == INF or rt == INF
res = [res, lt + rt + a].min
}
puts res != INF ? res : -1