結果
問題 |
No.3047 Verification of Sorting Network
|
ユーザー |
👑 |
提出日時 | 2025-02-12 19:33:09 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 1,745 ms / 2,000 ms |
コード長 | 2,822 bytes |
コンパイル時間 | 145 ms |
コンパイル使用メモリ | 8,604 KB |
実行使用メモリ | 15,232 KB |
最終ジャッジ日時 | 2025-03-05 20:42:07 |
合計ジャッジ時間 | 64,934 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 61 |
コンパイルメッセージ
Syntax OK
ソースコード
#!/usr/bin/env ruby MAX_T = 1000 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_i = 0 until stack.empty? catch do |sortedtag| z, o, i = stack.pop while i < m a, b = cmps[i] if ((o >> a) & 1) == 0 || ((z >> b) & 1) == 0 # no-op elsif ((z >> a) & 1) == 1 && ((o >> b) & 1) == 1 unused[i] = false qz, qo, z = z, (o ^ (1 << a) ^ (1 << b)), (z ^ (1 << b)) if (qo & (qz >> 1)) != 0 stack << [qz, qo, i] end if (o & (z >> 1)) == 0 throw sortedtag end 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)) if (o & (z >> 1)) == 0 throw sortedtag end end i += 1 end unsorted_i |= (o & (z >> 1)) end # catch end # until if unsorted_i != 0 unsorted = (0..n - 2).map {|i| ((unsorted_i >> i) & 1) != 0 } 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