結果

問題 No.282 おもりと天秤(2)
ユーザー simansiman
提出日時 2022-01-13 04:53:33
言語 Ruby
(3.3.0)
結果
AC  
実行時間 1,290 ms / 5,000 ms
コード長 1,537 bytes
コンパイル時間 363 ms
コンパイル使用メモリ 11,360 KB
実行使用メモリ 33,700 KB
平均クエリ数 214.29
最終ジャッジ日時 2023-09-24 03:02:20
合計ジャッジ時間 14,381 ms
ジャッジサーバーID
(参考情報)
judge13 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 108 ms
31,368 KB
testcase_01 AC 113 ms
31,068 KB
testcase_02 AC 111 ms
31,336 KB
testcase_03 AC 109 ms
31,308 KB
testcase_04 AC 108 ms
31,244 KB
testcase_05 AC 111 ms
30,948 KB
testcase_06 AC 118 ms
31,144 KB
testcase_07 AC 105 ms
30,700 KB
testcase_08 AC 116 ms
31,080 KB
testcase_09 AC 104 ms
30,804 KB
testcase_10 AC 392 ms
32,676 KB
testcase_11 AC 1,164 ms
33,076 KB
testcase_12 AC 432 ms
32,260 KB
testcase_13 AC 604 ms
32,512 KB
testcase_14 AC 994 ms
33,040 KB
testcase_15 AC 1,222 ms
33,496 KB
testcase_16 AC 176 ms
31,824 KB
testcase_17 AC 581 ms
32,400 KB
testcase_18 AC 877 ms
32,800 KB
testcase_19 AC 894 ms
32,948 KB
testcase_20 AC 1,290 ms
33,296 KB
testcase_21 AC 1,274 ms
33,700 KB
testcase_22 AC 686 ms
33,448 KB
testcase_23 AC 104 ms
30,688 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
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