結果
問題 |
No.409 ダイエット
|
ユーザー |
|
提出日時 | 2017-08-16 02:43:20 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,025 bytes |
コンパイル時間 | 168 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 26,036 KB |
最終ジャッジ日時 | 2024-10-13 11:12:27 |
合計ジャッジ時間 | 9,269 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 55 TLE * 1 -- * 36 |
ソースコード
from collections import deque N, A, B, W = map( int, input().split() ) D = list( map( int, input().split() ) ) dp = [ 0 for i in range( N + 1 ) ] def get_cost( x, rb ): d = rb - x - 1 return dp[ x ] + d * ( d + 1 ) // 2 * B - d * A + D[ rb - 1 ] dq = deque() dp[ 0 ] = W dq.append( [ 0, 1, N ] ) for i in range( 1, N + 1 ): while dq[ 0 ][ 2 ] < i: dq.popleft() dp[ i ] = get_cost( dq[ 0 ][ 0 ], i ) while len( dq ) > 1: x, lb, rb = dq[ len( dq ) - 1 ] if get_cost( x, lb ) >= get_cost( i, lb ): dq.pop() if len( dq ): dq[ len( dq ) - 1 ][ 2 ] = N else: break best = -1 x, lb, rb = dq[ len( dq ) - 1 ][ 0 ], i + 1, N while lb <= rb: mid = lb + rb >> 1 if get_cost( x, mid ) >= get_cost( i, mid ): best = mid rb = mid - 1 else: lb = mid + 1 if best == -1: continue dq[ len( dq ) - 1 ][ 2 ] = best - 1 dq.append( [ i, best, N ] ) print( min( dp[ i ] + ( N - i ) * ( N - i + 1 ) // 2 * B - ( N - i ) * A for i in range( N + 1 ) ) )