CF311B 고양이 전송 [해결책] 경사 최적화 문제

질문은 표면 : 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 ; 
}

 

추천

출처www.cnblogs.com/ChrisKKK/p/11524459.html