結果
| 問題 |
No.1008 Bench Craftsman
|
| コンテスト | |
| ユーザー |
titia
|
| 提出日時 | 2020-05-29 15:21:19 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 792 ms / 2,000 ms |
| コード長 | 1,411 bytes |
| コンパイル時間 | 175 ms |
| コンパイル使用メモリ | 82,328 KB |
| 実行使用メモリ | 261,052 KB |
| 最終ジャッジ日時 | 2024-10-15 03:53:40 |
| 合計ジャッジ時間 | 14,732 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
import sys
input = sys.stdin.readline
N,M=map(int,input().split())
A=list(map(int,input().split()))
PE=[tuple(map(int,input().split())) for i in range(M)]
P=[0]*(N+1)
for x,w in PE:
P[x]+=w
for i in range(N):
if A[i]<=P[i+1]:
print(-1)
sys.exit()
OK=1<<62
NG=-1
while OK-NG>1:
mid=(OK+NG)//2
P=[0]*(N+2)
R=[0]*(N+2)
L=[0]*(N+2)
RR=[0]*(N+2)
LL=[0]*(N+2)
for x,w in PE:
if mid!=0:
h=w//mid
else:
h=10**9
P[max(1,x-h)]+=w
if x+h+1<N+2:
P[x+h+1]-=w
if h==0:
continue
R[x+1]-=mid
if x+h+1<N+2:
R[x+h+1]+=mid
if x+h+1<N+2:
RR[x+h+1]+=h*mid
L[x-1]-=mid
if x-h-1>=0:
L[x-h-1]+=mid
if x-h-1>=0:
LL[x-h-1]+=h*mid
#print(P,R,L,RR,LL)
for i in range(1,N+2):
P[i]+=P[i-1]
R[i]+=R[i-1]
for i in range(N,-1,-1):
L[i]+=L[i+1]
for i in range(N+2):
R[i]+=RR[i]
L[i]+=LL[i]
for i in range(1,N+2):
R[i]+=R[i-1]
for i in range(N,-1,-1):
L[i]+=L[i+1]
#print(mid,P,R,L)
#print([P[i]+R[i]+L[i] for i in range(1,N+1)])
for i in range(1,N+1):
if P[i]+R[i]+L[i]<A[i-1]:
True
else:
NG=mid
break
else:
OK=mid
print(OK)
titia