結果
| 問題 |
No.1708 Quality of Contest
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-10-30 16:08:46 |
| 言語 | Ruby (3.4.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,388 bytes |
| コンパイル時間 | 237 ms |
| コンパイル使用メモリ | 7,552 KB |
| 実行使用メモリ | 73,252 KB |
| 最終ジャッジ日時 | 2024-10-07 13:45:08 |
| 合計ジャッジ時間 | 5,589 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 6 TLE * 1 -- * 16 |
コンパイルメッセージ
Main.rb:30: warning: mismatched indentations at 'end' with 'else' at 28 Main.rb:115: warning: assigned but unused variable - k Syntax OK
ソースコード
class PriorityQueue
def initialize(array = [])
@data = []
array.each{|a| push(a)}
end
def push(element)
@data.push(element)
bottom_up
end
def pop
if size == 0
return nil
elsif size == 1
return @data.pop
else
min = @data[0]
@data[0] = @data.pop
top_down
return min
end
end
def poll
if size == 0
return nil
else
return @data[0]
end
end
def size
@data.size
end
def data
@data
end
private
def swap(i, j)
@data[i], @data[j] = @data[j], @data[i]
end
def parent_idx(target_idx)
(target_idx - (target_idx.even? ? 2 : 1)) / 2
end
def bottom_up
target_idx = size - 1
return if target_idx == 0
parent_idx = parent_idx(target_idx)
while (@data[parent_idx][0] < @data[target_idx][0])
swap(parent_idx, target_idx)
target_idx = parent_idx
break if target_idx == 0
parent_idx = parent_idx(target_idx)
end
end
def top_down
target_idx = 0
# child がある場合
while (has_child?(target_idx))
a = left_child_idx(target_idx)
b = right_child_idx(target_idx)
if @data[b].nil?
c = a
else
c = @data[a][0] >= @data[b][0] ? a : b
end
if @data[target_idx][0] < @data[c][0]
swap(target_idx, c)
target_idx = c
else
return
end
end
end
# @param Integer
# @return Integer
def left_child_idx(idx)
(idx * 2) + 1
end
# @param Integer
# @return Integer
def right_child_idx(idx)
(idx * 2) + 2
end
# @param Integer
# @return Boolent
def has_child?(idx)
((idx * 2) + 1) < @data.size
end
end
N, M, X = gets.split(" ").map{|s| s.to_i}
A = Array.new(M) {PriorityQueue.new}
N.times {
a, b = gets.split(" ").map{|s| s.to_i}
A[b-1].push([a,b])
}
k = gets.to_i
c = gets.split(" ").map{|s| s.to_i}
cnt = []
same = PriorityQueue.new
diff = PriorityQueue.new
0.upto(M-1) {|j|
diff.push(A[j].pop) if A[j].size > 0
}
c.max.times {
sa, sb = same.size > 0 ? same.poll : [-Float::INFINITY, -1]
da, db = diff.size > 0 ? diff.poll : [-Float::INFINITY, -1]
if sa > da + X then
same.pop
ns = A[sb-1].pop
same.push(ns) if ns
cnt << sa
else
diff.pop
ns = A[db-1].pop
same.push(ns) if ns
cnt << da + X
end
}
total = 0
c.each {|i|
total += cnt[0,i].sum
}
puts total