문제의 의미
있다 $ N $ 나무의 수, 나무 $ H_i의 $ 당 높은 수준을 가지고, $ C_I $, $ P_i의 $의 수는 최소의 트리의 나머지 부분은 일반적으로 가장 높은 나무보다 더 많은 수 있도록, 지금 당신은 어떤 나무를 절단 할 비용 비용. (1 $ \ 당량의 N 개의 \ 당량의 10 ^ 5 \ 1 \ 당량 H_i \ 당량 10 ^ 9 \ 1 \ 당량 C_I \ 당량 200 \ 1 \ 당량 P_i \ 당량 $ 10 ^ 9)
분석
우선, 우리는 가장 높은 나무의 높이를 열거해야한다고 생각하기 쉬운 삭감 모두 더 높은, 다음 k 번째 작은 컷의 저렴한 비용에서 선택합니다.
그것은 K의 현재 최소의 비용을 구하는 방법에 초점을 맞추고 있습니다.
$ C_I $의 범위가 매우 작다는 것을주의 그래서 우리는 다수의 비용이 $ i가 $ C로 표시된 트리 [I] (200 배럴의 설립 상당) $ $ 셀 수있다.
높은 다시 통과, 분류하여 로우에서 하이로, 세계 최소의 비용으로 구매하십시오. 복잡성은 $ O (200N) $, 이진 검색이 $ 할 수 있다면 O (log200 \ cdot N) $입니다.
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; #DEFINE는 오래 오래 LL 구조체 나무 { LL의 시간, C, P; }이 [ 100005 ]; 부울 CMP (트리 A, 트리 b) { 리턴 아 < BH; } LL 않음; LL TMP = 0 , ANS = 0 , TOT = 0 ; LL 인분 [ 205 ]; INT 의 main () { 동안 (CIN >> N) { memset 함수 (NUM, 0 , 는 sizeof (NUM)); ANS = TMP = TOT = 0; 대해 (LL I = 0 ; I <N은; ++ I) { 는 scanf ( " % LLD % LLD % LLD " , A [i]를 .H, A [i]를가 .c, & A [i]를 .P); TMP + = A [I]가 .c * A [i]를 .P; } ANS = TMP; 정렬 (a하는 + N, CMP); 대 (LL I = 0 ; I <N는, d, J = I , J) { J = 1; 반면 ++ (a [i]를 .H && J <N == .H A [J]) J 단계; LL 합 = 0 ; LL 비용 = 0 ; ...에 대한(LL의 t = 1, t <J; ++ t)는 { TMP는 - A [t]가 .c * = A [t]를 .P; TOT + = A [t] .P; 합계 + = A [t] .P; } 합 = TOT 합 * 2 + 1 ; 대 (LL w = 1 ; 합> 0 ; ++ w) { 경우 (NUM <= [w] 합) { 선정 + = w * NUM [w]; 합 - = [w] NUM; } 다른 { 선정 + = 합계 *w; 휴식 ; } } ANS = 분 (ANS 비용 + TMP); 대 (LL에서 t = 1이; t <J; ++ t) { NUM [A [t]가 .c] + = A [t] .P; } } COUT << ANS << ENDL; } }
참고 링크 : https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41065020