結果
| 問題 | No.282 おもりと天秤(2) |
| コンテスト | |
| ユーザー |
siman
|
| 提出日時 | 2022-01-13 04:53:33 |
| 言語 | Ruby (3.4.1) |
| 結果 |
AC
|
| 実行時間 | 1,296 ms / 5,000 ms |
| コード長 | 1,537 bytes |
| コンパイル時間 | 38 ms |
| コンパイル使用メモリ | 7,552 KB |
| 実行使用メモリ | 31,072 KB |
| 平均クエリ数 | 214.29 |
| 最終ジャッジ日時 | 2024-07-17 03:07:13 |
| 合計ジャッジ時間 | 13,966 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
コンパイルメッセージ
Syntax OK
ソースコード
N = gets.to_i
omori = [*1..N]
R = Array.new(N + 1) { Array.new(N + 1, 0) }
def merge_sort(l, r, arr, stack, checked)
return [arr[l]] if r - l == 0
return [] if r - l < 0
mid = (l + r) / 2
que_a = merge_sort(l, mid, arr, stack, checked)
que_b = merge_sort(mid + 1, r, arr, stack, checked)
ret = []
while !que_a.empty? || !que_b.empty?
if que_a.empty?
ret << que_b.shift
elsif que_b.empty?
ret << que_a.shift
elsif R[que_a.first][que_b.first] == -1
ret << que_a.shift
elsif R[que_b.first][que_a.first] == -1
ret << que_b.shift
else
if !checked[que_a.first] && !checked[que_b.first]
checked[que_a.first] = true
checked[que_b.first] = true
stack << [que_a.first, que_b.first]
end
ret << que_a.shift
end
end
ret
end
def send_query(stack)
query = Array.new(2 * N, 0)
stack.each_with_index do |(i, j), idx|
break if idx >= N
query[2 * idx] = i
query[2 * idx + 1] = j
end
STDOUT.puts("? #{query.join(' ')}")
STDOUT.flush
res = gets.chomp.split
res.each_with_index do |r, idx|
i, j = stack[idx]
break if i.nil?
if r == '<'
R[i][j] = -1
R[j][i] = 1
else
R[i][j] = 1
R[j][i] = -1
end
end
end
loop do
stack = []
checked = Array.new(N + 1, false)
merge_sort(0, N - 1, omori, stack, checked)
break if stack.empty?
send_query(stack)
end
checked = Array.new(N + 1, false)
ans = merge_sort(0, N - 1, omori, [], checked)
puts "! #{ans.join(' ')}"
siman