結果
| 問題 | 
                            No.282 おもりと天秤(2)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             siman
                         | 
                    
| 提出日時 | 2022-01-13 04:51:06 | 
| 言語 | Ruby  (3.4.1)  | 
                    
| 結果 | 
                             
                                RE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,281 bytes | 
| コンパイル時間 | 349 ms | 
| コンパイル使用メモリ | 7,552 KB | 
| 実行使用メモリ | 31,584 KB | 
| 平均クエリ数 | 1.96 | 
| 最終ジャッジ日時 | 2024-11-16 00:03:21 | 
| 合計ジャッジ時間 | 8,233 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 2 RE * 22 | 
コンパイルメッセージ
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)
  return [arr[l]] if r - l == 0
  return [] if r - l < 0
 
  mid = (l + r) / 2
  que_a = merge_sort(l, mid, arr, stack)
  que_b = merge_sort(mid + 1, r, arr, stack)
  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
      stack << [que_a.first, que_b.first]
      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 = []
  merge_sort(0, N - 1, omori, stack)
  break if stack.empty?
  send_query(stack)
end
ans = merge_sort(0, N - 1, omori, [])
puts "! #{ans.join(' ')}"
            
            
            
        
            
siman