結果
| 問題 |
No.1008 Bench Craftsman
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 21:41:56 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 235 ms / 2,000 ms |
| コード長 | 2,504 bytes |
| コンパイル時間 | 172 ms |
| コンパイル使用メモリ | 81,904 KB |
| 実行使用メモリ | 129,552 KB |
| 最終ジャッジ日時 | 2025-04-15 21:43:59 |
| 合計ジャッジ時間 | 5,942 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
import sys
def main():
input = sys.stdin.read().split()
ptr = 0
N = int(input[ptr])
ptr += 1
M = int(input[ptr])
ptr += 1
a = list(map(int, input[ptr:ptr+N]))
ptr += N
sum_w = [0] * (N + 2) # 1-based
people = []
max_w = 0
for _ in range(M):
x = int(input[ptr])
ptr += 1
w = int(input[ptr])
ptr += 1
people.append((x, w))
sum_w[x] += w
if w > max_w:
max_w = w
# Check impossible case
for i in range(1, N+1):
if sum_w[i] >= a[i-1]:
print(-1)
return
# Check c=0 case
total_w = sum(w for x, w in people)
valid = True
for ai in a:
if total_w > ai:
valid = False
break
if valid:
print(0)
return
# Binary search
low = 1
high = max_w
answer = -1
while low <= high:
mid = (low + high) // 2
# Initialize difference arrays
diff_A = [0] * (N + 2) # 1-based to N, +2 for safety
diff_B = [0] * (N + 2)
for x, w in people:
if mid == 0:
continue # handled earlier
k = (w - 1) // mid
# Left interval: x -k to x-1
left_start = max(1, x - k)
left_end = x - 1
if left_start <= left_end:
A = mid
B = w - mid * x
# Add to diff_A and diff_B
diff_A[left_start] += A
diff_A[left_end + 1] -= A
diff_B[left_start] += B
diff_B[left_end + 1] -= B
# Right interval: x to x +k
right_start = x
right_end = min(N, x + k)
if right_start <= right_end:
A = -mid
B = w + mid * x
diff_A[right_start] += A
diff_A[right_end + 1] -= A
diff_B[right_start] += B
diff_B[right_end + 1] -= B
# Compute prefix sums
A_total = 0
B_total = 0
valid = True
for i in range(1, N+1):
A_total += diff_A[i]
B_total += diff_B[i]
current_load = A_total * i + B_total
if current_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()
lam6er