[+ DP] poj3171 세그먼트 트리

질문의 의미 : 비용 값 N 간격은, 적어도, 얼마나 많은 가격 범위 [M, E] 덮여달라고 요청

포털 : https://vjudge.net/problem/POJ-3171

실제로 매우 간단한 DP :, DP [J]이다 최소 비용 DP [J] = 분 {DP [J], (DP)을 포함하는 J의 (S)를 나타내고, [K] (t1-1 <= k는 <= T2-1) 선정 + [I]}. 나는 오른쪽 끝 지점의 종류, 그리고 다음 따라서 순서의 각 업데이트를 보장한다. 코드에서 특정보세요.

1  // 투쟁을 중단하고 당신이 살고 중단 
 사용법 #include <iostream>
 3 사용법 #include <cmath>
 4 사용법 #include <cstdio>
 5 사용법 #include <CString을>
 6 사용법 #include <알고리즘>
 7 사용법 #include <큐>
 (8) 의 #include <벡터>
 9 #INCLUDE < 설정 >
 10 #INCLUDE <지도>
 11 #INCLUDE <적층>
 12  이용한  스페이스 성병;
13 타입 정의  LL;
14  CONST  INT INF = 0x3f3f3f3f ;
 구조체 노드 {
 16      INT의 L, R, V;
17      부울  연산자 <( CONST 노드 b) CONST {
 18          반환 R < BR;
19      }
 20 } A [ 10000 + 9 ];
21  의 INT TR [ 880000 ];
(22)  보이드 빌드 ( INT의 L, INT의 R, INT O) {
 23 일      경우 (L == R) {
 24          TR [0] = INF;
25          복귀 ;
(26)     }
 27      INT m = (L +에서의 R) / 2 ;
28      빌드 (L, M, O << 1 );
29      빌드 (m + 1 << O, R, 1 | 1 );
30      TR [0] = 분 (TR [O << 1 , TR] [0 << 1 | 1 ]);
31      ;
32  }
 33  INT 쿼리 ( INT L, INT의 R, INT의 O, INT의 X, INT의 Y) {
 34      의 경우 (X <= 1 && R <= y)를 반환 TR [0];
(35)     INT m = (L +의 연구) >> 1 ;
36      INT ANS = INF;
37      의 경우 (X <= m) ANS = 분 (ANS 쿼리 (L, M, O << 1 , X, Y));
38      의 경우 (예> m) ANS = 분 (ANS 쿼리 (m + 1 , R, O << 1 | 1 , X, Y));
39      리턴 ANS;
40  }
 41  무효 업데이트 ( INT의 L, INT의 R, INT의 O, INT의 X, INT의 V) {
 42      의 경우 (L == R) {
 43          TR [0] = V;
(44)         반환 ;
45      }
 46      INT m = (L +의 연구) >> 1 ;
(47)      의 경우 (X <= m) 업데이트 (L, M, O << 1 , X, V);
48      다른 업데이트 (m + 1 O, R, << 1 | 1 , X, V);
49      TR [0] = 분 (TR [O << 1 , TR] [0 << 1 | 1 ]);
50  }
 51  INT 의 main () {
 52      INT의 N, S, T,는 scanf ( " % D % D % D " , 및 N, S, t);
53      T- = S- 2 ;
(54)     위한 ( int로 I = 1 ; i가 = N <; ++ I) {
 55          는 scanf ( " % D % D % D ' , A [i]를 .L, A [i]를 .R, & A [I] .V) ;
56          A [i]를 .l- = S- 2 ;
57          A [i]를 .r- = S- 2 ;
58      }
 59      S = 2 ;
60      정렬 (A + 1 , A + 1 + N);
61      빌드 ( 1 , t, 1 );
62      업데이트 ( 1 , t, 1 , 1 ,0 );
63      // 업데이트 (1, t, 1,2,0); 
(64)      에 대한이 ( 값 int = 1을 1 ; 나는 = <N; ++ I) {
 65          INT의 TEM 쿼리 = ( 1 , t, 1 , A [i]를 .l- 1 , A [i]를 .r- 1 );
66          INT INI 쿼리 = ( 1 , t, 1 , A [i]를 .R, A [i]를 .R);
(67)          만약 (TEM + A [I] .V <INI) 업데이트 ( 1 , t, 1 , A [i]를 .R, TEM + A [I] .V);
68      }
 69      INT ANS 쿼리 = ( 1 , t, 1 , t, t);
(70)     경우 (ANS == INF) 풋 ( " -1 " );
71      다른에서 의 printf ( " %의 D " , ANS);
72      반환  0 ;
73 }
코드보기

 

추천

출처www.cnblogs.com/xiaobuxie/p/11183681.html