結果
| 問題 |
No.2114 01 Matching
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-16 00:31:39 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,962 bytes |
| コンパイル時間 | 730 ms |
| コンパイル使用メモリ | 81,152 KB |
| 実行使用メモリ | 180,272 KB |
| 最終ジャッジ日時 | 2025-04-16 00:33:36 |
| 合計ジャッジ時間 | 28,138 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 WA * 21 |
ソースコード
import bisect
def main():
import sys
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx])
idx += 1
M = int(data[idx])
idx += 1
K = int(data[idx])
idx += 1
B = list(map(int, data[idx:idx+N]))
idx += N
R = list(map(int, data[idx:idx+M]))
idx += M
from collections import defaultdict
mod_blue = defaultdict(list)
mod_red = defaultdict(list)
for b in B:
mod = b % K
mod_blue[mod].append(b)
for r in R:
mod = r % K
mod_red[mod].append(r)
S = min(N, M)
total = 0
cost_list = []
for mod in mod_blue:
if mod not in mod_red:
continue
blue = sorted(mod_blue[mod])
red = sorted(mod_red[mod])
len_b = len(blue)
len_r = len(red)
s_g = min(len_b, len_r)
if s_g == 0:
continue
total += s_g
# For each red element, find the closest in blue and compute the minimal diff
red_diff = []
for r_val in red:
pos = bisect.bisect_left(blue, r_val)
min_diff = float('inf')
if pos < len_b:
min_diff = min(min_diff, abs(blue[pos] - r_val))
if pos > 0:
min_diff = min(min_diff, abs(blue[pos-1] - r_val))
red_diff.append( (min_diff, r_val) )
# Sort red by the minimal diff, then take top s_g elements
red_diff.sort()
selected_red = [rd[1] for rd in red_diff[:s_g]]
selected_red.sort()
# Pair blue and selected_red
current_cost = []
for b_val, r_val in zip(blue[:s_g], selected_red):
delta = abs(b_val - r_val)
cost = delta // K
current_cost.append(cost)
cost_list.extend(current_cost)
if len(cost_list) < S:
print(-1)
return
cost_list.sort()
print(sum(cost_list[:S]))
if __name__ == '__main__':
main()
lam6er