結果
問題 |
No.2434 RAKUTAN de RAKUTAN
|
ユーザー |
![]() |
提出日時 | 2025-04-15 23:49:16 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,546 bytes |
コンパイル時間 | 286 ms |
コンパイル使用メモリ | 82,200 KB |
実行使用メモリ | 80,864 KB |
最終ジャッジ日時 | 2025-04-15 23:51:07 |
合計ジャッジ時間 | 6,589 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 5 WA * 17 RE * 2 |
ソースコード
import bisect def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]); idx +=1 H = int(input[idx]); idx +=1 X = int(input[idx]); idx +=1 G = int(input[idx]); idx +=1 g_list = list(map(int, input[idx:idx+G])) idx += G g_list.sort() B = int(input[idx]); idx +=1 b_list = list(map(int, input[idx:idx+B])) idx += B b_list.sort() intervals = set() for x in g_list + b_list: start_a = max(0, x - (X-1)) end_a = x - 1 for a in range(start_a, end_a + 1): s = a + 1 e = a + X - 1 if e > N: continue intervals.add((s, e)) filtered_intervals = [] for s, e in intervals: left_g = bisect.bisect_left(g_list, s) right_g = bisect.bisect_right(g_list, e) count_g = right_g - left_g left_b = bisect.bisect_left(b_list, s) right_b = bisect.bisect_right(b_list, e) count_b = right_b - left_b value = count_b - count_g if value > 0: filtered_intervals.append((s, e, value)) filtered_intervals.sort(key=lambda x: x[1]) latest = [-1] * len(filtered_intervals) for i in range(len(filtered_intervals)): s_i = filtered_intervals[i][0] low, high = 0, i - 1 best_j = -1 while low <= high: mid = (low + high) // 2 if filtered_intervals[mid][1] < s_i: best_j = mid low = mid + 1 else: high = mid - 1 latest[i] = best_j max_possible_k = min(H, len(filtered_intervals)) dp = [-float('inf')] * (max_possible_k + 1) dp[0] = 0 for i in range(len(filtered_intervals)): s, e, value = filtered_intervals[i] j = latest[i] new_dp = dp.copy() for k in range(1, max_possible_k + 1): if j == -1: if k == 1: new_dp[k] = max(new_dp[k], value) else: if k - 1 >= 0 and dp[k - 1] != -float('inf'): possible = dp[k - 1] + value if possible > new_dp[k]: new_dp[k] = possible if value > new_dp[1]: new_dp[1] = value dp = new_dp max_sum = max(dp) if max(dp) != -float('inf') else 0 total_g = G total_b = B result = (total_g - total_b) + max_sum print(result) if __name__ == '__main__': main()