질문은 표면 : http://codeforces.com/contest/311/problem/B
Luogu 질문 표면 : https://www.luogu.com.cn/problem/CF311B
최적화 경사 DP
거리에 배치하는 1 - 우리는 t [i]는 고양이의 종료 시간을 설정 =.
고양이가 기다릴 수 있도록 시작할 때부터.
최고의 여행에 우리는 확실히 대기를 원하지 않는다.
그의 정렬이, 그 모든이 시간 이후 왔는데 K 고양이 개종에 수신 할 수있는 단지 고양이 고양이 내가 사이에받을 수 있습니다.
조금 주위에.
그런 식 DP가 도입 될 수있다.
F [I] [J] = 분 ([I] [J] F, F [I -1] [K] + T는 [j]가 * (JK) - (S가 [j]가 -s [K])).
제거 된 분.
F [I-1] [K] + S [K] =를 t [J] * K + F [i]는 [J] -t [J]의 * J + S [J]
Y = KX + B로 설정 형태.
다음에 k는 t의 [j를]이고, X는 Y는 많은 앞이고, K이다.
당신은 볼록 선체의 낮은 기울기가 최적화되어 유지 드릴 것입니다.
다음과 같이 코드입니다 :
#INCLUDE <. 비트 / stdc ++ H> #DEFINE가 긴 긴 것이다 사용 스페이스 성병; CONST의 INT maxn 1E5 + = 10 ; LL의 F [ 110 ] [maxn], g [maxn] 님의 [maxn], t [maxn]; INT의 N, M, P, D [maxn], Q [maxn]; INT 의 main () { 는 scanf ( " % D % D % D " , 및 N, M, P); 위한 ( int로 난 = 2 나 ++; i가 N = < {) 는 scanf ( " %의 D ' , D [I]를) D [I]가 D = + [I- 1 ]; } 에 대해 ( int로 난을 =1 ; I <= m; 내가 ++ ) { INT의 X, Y]는 scanf ( " % d 개 %의 D ' , X, Y); t [내가] = Y- D [X]; } 정렬 (t + 1 , t + 1 + m); 위한 ( int로 I = 1 ; I <= m; 내가 ++) S [I] =에서 S [I- 1 ] + T를 [I]; memset 함수 (F, 0x3F입니다 , 는 sizeof (F)); F [ 0 ] [ 0 ] = 0 ; 위한 ( int로 I = 1 ; I <= P; 내가 ++ ) { 대 ( INT의 J = 1 ; J <= m; J ++) g [J] = F [Ⅰ- 1 ] [J] + S [J] INT의 L = 1 , R = 1 ] Q [ 1 ] = 0 ; 대 ( INT의 J = 1 ; J <= m; J ++ ) { 동안 (L <R && g [Q [L + 1 ] - g [Q [1] <= t [J] * (Q [L + 1 ] -q [1,5]))를 L ++ ; F [I]은 [J]를 분 = ([I-F 1 ] [J], g [Q [1]] + t [J] * (JQ [1]) - S [J]); 경우 (g의 [j를]> = 0x3f3f3f3f3f3f3f3fll)가 계속 ; 반면 (L <R && (g [J] -g [Q [R]) * (Q [R] -q [R- 1 ]) <= (g [Q [R] - g [Q [R - 1 ]) * (JQ [R])) r-- 사용 ; Q [ ++ R = J; } } 의 printf ( " % LLD \ 없음 ' , F [P] [m]); 반환 0 ; }