結果
問題 |
No.3047 Verification of Sorting Network
|
ユーザー |
👑 |
提出日時 | 2025-02-15 00:00:08 |
言語 | Ruby (3.4.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,633 bytes |
コンパイル時間 | 306 ms |
コンパイル使用メモリ | 8,740 KB |
実行使用メモリ | 22,684 KB |
最終ジャッジ日時 | 2025-03-05 20:42:22 |
合計ジャッジ時間 | 4,097 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 TLE * 1 |
other | -- * 61 |
コンパイルメッセージ
Syntax OK
ソースコード
#!/usr/bin/env ruby MAX_T = 10000 MAX_N = 27 MAX_COST = 1e8 PHI = Math.sqrt(1.25) + 0.5 # 1.61803398875, golden ratio class IsSortingOk def initialize data @data = data end def is_sorting? true end def to_s "Yes" end def data @data end end class IsSortingNg def initialize data @data = data end def is_sorting? false end def to_s "No" end def data @data end end def is_sorting_network(n, cmps) raise "Invalid input" unless n >= 2 && cmps.all? { |a, b| 0 <= a && a < b && b < n } m = cmps.length stack = [[(1 << n) - 1, (1 << n) - 1, 0]] unused = Array.new(m, true) unsorted = Array.new(n - 1, false) until stack.empty? z, o, i = stack.pop while i < m a, b = cmps[i] if (((z & ~o) >> a) & 1) == 1 || (((~z & o) >> b) & 1) == 1 # no-op elsif (((z & o) >> a) & 1) == 1 && (((z & o) >> b) & 1) == 1 unused[i] = false qz, qo, z = z, (o ^ (1 << a) ^ (1 << b)), (z ^ (1 << b)) stack << [qz, qo, i] else unused[i] = false xz, xo = (((z >> a) ^ (z >> b)) & 1), (((o >> a) ^ (o >> b)) & 1) z, o = (z ^ (xz << a) ^ (xz << b)), (o ^ (xo << a) ^ (xo << b)) end i += 1 end 0.upto(n - 2) do |j| if (((z & ~o) >> j) & 1) == 0 && (((~z & o) >> (j + 1)) & 1) == 0 unsorted[j] = true end end end # until if unsorted.any? return IsSortingNg.new(unsorted) end return IsSortingOk.new(unused) end def main RubyVM::YJIT.enable # cost of the test cases cost = 0 # number of test cases t = gets.to_i raise "Invalid input" unless (1..MAX_T).include?(t) t.times do # number of elements, number of comparisons n, m = gets.split.map(&:to_i) raise "Invalid input" unless (2..MAX_N).include?(n) && (1..(n * (n - 1) / 2)).include?(m) cost += m * PHI**n raise "Cost too high" if cost > MAX_COST # 1-indexed -> 0-indexed va = gets.split.map {|x| x.to_i - 1 } vb = gets.split.map {|x| x.to_i - 1 } cmps = va.zip(vb) cmps.each do |a, b| raise "Invalid input" unless 0 <= a && a < b && b < n end result = is_sorting_network(n, cmps) puts result if result.is_sorting? raise "Invalid output" unless result.data.length == m puts result.data.count { |x| x } puts result.data.each_with_index.filter_map { |x, i| i + 1 if x }.join(' ') else raise "Invalid output" unless result.data.length == n - 1 puts result.data.count { |x| x } puts result.data.each_with_index.filter_map { |x, i| i + 1 if x }.join(' ') end end end main