結果
問題 |
No.2114 01 Matching
|
ユーザー |
![]() |
提出日時 | 2025-04-16 16:49:58 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,962 bytes |
コンパイル時間 | 427 ms |
コンパイル使用メモリ | 81,552 KB |
実行使用メモリ | 180,188 KB |
最終ジャッジ日時 | 2025-04-16 16:51:52 |
合計ジャッジ時間 | 27,480 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()