結果
問題 |
No.1008 Bench Craftsman
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:32:16 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,868 bytes |
コンパイル時間 | 575 ms |
コンパイル使用メモリ | 81,664 KB |
実行使用メモリ | 151,812 KB |
最終ジャッジ日時 | 2025-04-16 15:37:34 |
合計ジャッジ時間 | 7,244 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 WA * 3 |
ソースコード
import sys 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 a = list(map(int, data[idx:idx+N])) idx +=N x_list = [] w_list = [] sum_self = [0]*(N+2) # 1-based sum_total =0 max_wj =0 for _ in range(M): x = int(data[idx]) idx +=1 w = int(data[idx]) idx +=1 x_list.append(x) w_list.append(w) sum_self[x] +=w sum_total +=w if w > max_wj: max_wj =w # Check sum_self for i in range(1, N+1): if sum_self[i] > a[i-1]: print(-1) return # Check sum_total valid = True for i in range(1, N+1): if sum_total > a[i-1]: valid = False break if valid: print(0) return # Binary search low =1 high = max_wj answer = -1 while low <= high: mid = (low + high) //2 # Initialize delta arrays delta_A = [0]*(N+2) delta_B = [0]*(N+2) for j in range(M): x = x_list[j] w = w_list[j] c = mid d_max = w // c # Left range left_start = max(1, x - d_max) left_end = x if left_start <= left_end: A_left = w - c * x B_left = c delta_A[left_start] += A_left if left_end +1 <= N: delta_A[left_end +1] -= A_left delta_B[left_start] += B_left if left_end +1 <= N: delta_B[left_end +1] -= B_left # Right range right_start = x +1 right_end = min(N, x + d_max) if right_start <= right_end: A_right = w + c * x B_right = -c delta_A[right_start] += A_right if right_end +1 <= N: delta_A[right_end +1] -= A_right delta_B[right_start] += B_right if right_end +1 <= N: delta_B[right_end +1] -= B_right # Compute sum_A and sum_B sum_A = [0]*(N+1) sum_B = [0]*(N+1) current_A =0 current_B =0 for i in range(1, N+1): current_A += delta_A[i] current_B += delta_B[i] sum_A[i] = current_A sum_B[i] = current_B # Check each i valid = True for i in range(1, N+1): load = sum_A[i] + sum_B[i] * i if load > a[i-1]: valid = False break if valid: answer = mid high = mid -1 else: low = mid +1 print(answer if answer !=-1 else -1) if __name__ == "__main__": main()