結果

問題 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

ソースコード

diff #

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(' ')}"
0