結果
| 問題 |
No.705 ゴミ拾い Hard
|
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2023-05-28 04:19:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,107 bytes |
| コンパイル時間 | 322 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 169,872 KB |
| 最終ジャッジ日時 | 2024-12-26 10:41:49 |
| 合計ジャッジ時間 | 28,712 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 38 TLE * 2 |
ソースコード
import sys
readline=sys.stdin.readline
def monotone_minima(N,cost,cnt=0,inf=1<<60):
dp=[inf]*(N+1)
dp[0]=0
if cnt:
for _ in range(cnt):
prev=dp
dp=[inf]*(N+1)
idx=[None]*(N+1)
dp[0]=0
idx[0]=0
for n in range(N+1):
if prev[n]+cost(n,N)<dp[N]:
dp[N]=prev[n]+cost(n,N)
idx[N]=n
while inf in dp:
lst=[i for i in range(N+1) if dp[i]!=inf]
for l,r in zip(lst,lst[1:]):
mid=(l+r)//2
for n in range(idx[l],min(idx[r],mid)+1):
if prev[n]+cost(n,mid)<dp[mid]:
dp[mid]=prev[n]+cost(n,mid)
idx[mid]=n
else:
def transition(L,R):
if R-L<=1:
return
mid=(L+R)//2
transition(L,mid)
update=[inf]*(R-mid)
idx=[inf]*(R-mid)
for n in range(L,mid):
if dp[n]+cost(n,mid)<update[0]:
update[0]=dp[n]+cost(n,mid)
idx[0]=n
if dp[n]+cost(n,R-1)<update[R-mid-1]:
update[R-mid-1]=dp[n]+cost(n,R-1)
idx[R-mid-1]=n
while inf in update:
lst=[i+mid for i in range(R-mid) if update[i]!=inf]
for l,r in zip(lst,lst[1:]):
m=(l+r)//2
for n in range(idx[l-mid],min(idx[r-mid],m)+1):
if dp[n]+cost(n,m)<update[m-mid]:
update[m-mid]=dp[n]+cost(n,m)
idx[m-mid]=n
for n in range(mid,R):
dp[n]=min(dp[n],update[n-mid])
transition(mid,R)
transition(0,N+1)
return dp[N]
N=int(readline())
A=list(map(int,readline().split()))
X=list(map(int,readline().split()))
Y=list(map(int,readline().split()))
inf=1<<60
def cost(l,r):
return abs(X[l]-A[r-1])**3+abs(Y[l])**3
ans=monotone_minima(N,cost,inf=inf)
print(ans)
vwxyz