結果
| 問題 |
No.1008 Bench Craftsman
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 21:31:29 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,887 bytes |
| コンパイル時間 | 165 ms |
| コンパイル使用メモリ | 82,104 KB |
| 実行使用メモリ | 136,944 KB |
| 最終ジャッジ日時 | 2025-04-15 21:33:40 |
| 合計ジャッジ時間 | 5,950 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 WA * 3 |
ソースコード
import sys
def main():
n, m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split())) # a[0] is a_1 in problem (1-based)
sum_all = 0
sum_x = [0] * (n + 2) # 1-based indexing for sections
people = []
for _ in range(m):
x, w = map(int, sys.stdin.readline().split())
sum_all += w
sum_x[x] += w
people.append((x, w))
# Check if c=0 is possible
valid = True
for ai in a:
if ai < sum_all:
valid = False
break
if valid:
print(0)
return
# Check if sum_x[i] exceeds a[i-1] for any i
for i in range(1, n + 1):
if sum_x[i] > a[i - 1]:
print(-1)
return
# Binary search setup
max_w = max(w for x, w in people)
low = 1
high = max_w
answer = -1 # This will be updated since sum_x is valid
def is_feasible(c):
diff_coeff = [0] * (n + 2)
diff_const = [0] * (n + 2)
for x, w in people:
if c == 0:
continue # Handled earlier
k = (w - 1) // c
# Left interval [x - k, x - 1]
L_left = max(1, x - k)
R_left = x - 1
if L_left <= R_left:
delta_a = c
delta_b = w - c * x
diff_coeff[L_left] += delta_a
if R_left + 1 <= n:
diff_coeff[R_left + 1] -= delta_a
diff_const[L_left] += delta_b
if R_left + 1 <= n:
diff_const[R_left + 1] -= delta_b
# Right interval [x, x + k]
R_right = min(n, x + k)
if x <= R_right:
delta_a = -c
delta_b = w + c * x
diff_coeff[x] += delta_a
if R_right + 1 <= n:
diff_coeff[R_right + 1] -= delta_a
diff_const[x] += delta_b
if R_right + 1 <= n:
diff_const[R_right + 1] -= delta_b
# Compute prefix sums for coefficients and constants
coeff = [0] * (n + 2)
current = 0
for i in range(1, n + 1):
current += diff_coeff[i]
coeff[i] = current
const = [0] * (n + 2)
current = 0
for i in range(1, n + 1):
current += diff_const[i]
const[i] = current
# Check each section
for i in range(1, n + 1):
load = coeff[i] * i + const[i]
if load > a[i - 1]:
return False
return True
# Perform binary search
while low <= high:
mid = (low + high) // 2
if is_feasible(mid):
answer = mid
high = mid - 1
else:
low = mid + 1
print(answer)
if __name__ == "__main__":
main()
lam6er