분할 및 정복 유지 보수 DP - 19 난창 (南昌) 네트워크 게임 C / cf750E

난창 (南昌) 네트워크 게임은 원래 제목 CF입니다

다음은이 문제를 할 첫째, 그래서 쿼리 [L, R],이 섹션의 요구 사항 2017 년 시퀀스가 ​​각 시간, 다음에 심각한하지만 수 2016 시퀀스를 가질 수는 최소의 요소를 삭제해야

1 | | 2 | 3 | 우리가 짧은 간격 요청하면 먼저, [L을, R은 다음에 분명히 단순한 입체 DP 할 수있는 상태 (0)가 4 (2), 21 (201)가있는 존재 키워드하지 않는 대표 2017 년 경우가, DP는 [I]는 [J] 난 제거 J 필요한 최소 상태로 된 상태에서 문자 천이를 나타낸다

그러면 명확들 [내가] = 6이 DP 때 [3] [3] = 1, DP [4] [4] = 1

결합 상태가 간격 [1,5 미드] 및 간격 [중간 + 1, R]를 들면 좋은 것을 알 수 있고, ,, 상태 DP1의 전반부는, 상태가 둘이 섹션 DP2의 절반이라고 구비 상태 DP [1] [R], 다음이 DP1 [L] [K] + DP는 [K]는 [R]를 DP [L]에서 [r] =

모든 국가는 그래서 우리는 시간이 더 빠르고, 그래서 충분히입니다하기 때문에 O (125 / 6nlogn) 인 복잡의 섹션을 추구하는 직접 파티션을 사용할 수 있습니다

#INCLUDE <비트 / STDC ++ H.>
 은 USING  공간 STD;
 #DEFINE N 200,005
 #DEFINE의 0x3f3f3f3f INF
 , S [N]
 INT N-, Q, 

공극 보호구 ( INT의 L, INT R & LT) {
     int로 I = L, J = R & LT ;
     그동안 (I은 < J)을 { 
        스왑은 (S [I]를, S [j]가)
         ++ I - J는; 
    } 
} 

// 상태 0, 1을 나타내지는 않는다, 상태 2는 20이고, 상태 2 나타낸다 (201)는 상태 4 2019 DP [I] [J 나타내고, 상태 3을 나타낸다 ] 이고 아이 -> J 비용 
 // 세그먼트 트리 인접 세그먼트 mergability 상태와 각 세그먼트는 병합 파티션 정보를 유지하는 것으로 생각하기 때문에, 세그먼트 제 n ^ DP 전송 부 (3)과 유사한 트리 [L, R] 보수 [L과 R] 모든 상태의 비용이 결합 될 때 
구조체 노드 {
     INT DP [5 ] [ 5 ]; 
    노드 () { 
        memset 함수 (DP, 0x3F입니다 , 는 sizeof DP); 
    } 
} SEG [N << 2 ];
#DEFINE의 LSON의 L, m, 실온 << 1
 #DEFINE의 rson의 m + 1, R, RT << 1 | 1 
노드 병합 (노드 A, 노드 B) { 
    기지국 입술; 
     ( INT를 L = 0 , L < 5 ; L ++ )
          ( INT에서 R = 0 , R < 5 ; R ++ )
              ( INT에서 K = 0 ; K < 5 ; 케이 ++) 
                res.dp [1] [R] = 분 (res.dp [1] [R], a.dp [L] [K] + b.dp [K] [R]);
    반환 입술을; 
} 
공극 빌드 ( INT의 L, INT의 R, INT의 RT) {
     경우 (L == R) {
         위해 ( int로 I = 0 ; i가 < 5 ; 내가 ++ ) 
            SEG를 [RT] .dp [I] [I] = 0 ;
        경우 (S [1] == ' 2 ' ) { 
            SEG [RT] .dp [ 0 ] [ 0 ] = 1 ; SEG [RT] .dp [ 0[ 1 ] = 0 ; 
        } 그렇지 않은  경우 (S [1] == ' 0 ' ) { 
            자체 [RT] .dp [ 1 ] [ 1 ] = 1 ; 아웃 [RT] .dp [ 1 ] [ 2 ] = 0 ; 
        } 그렇지 않은  경우 (S [1] == ' 1 ' ) { 
            자체 [RT] .dp [ 2 ] [ 2 ] = 1 ; 아웃 [RT] .dp [ 2 ] [ 3 ] = 0 ; 
        } 그렇지 않은  경우 (S [1] ==' 9 ' ) { 
            자체 [RT] .dp [ 3 ] [ 3 ] = 1 ; 아웃 [RT] .dp [ 3 ] [ 4 ] = 0 ; 
        } 그렇지 않은  경우 (S [1] == ' 8 ' ) { 
            자체 [RT] .dp [ 3 ] [ 3 ] = 1 ; 아웃 [RT] .dp [ 4 ] [ 4 ] = 1 ; 
        } 
        반환 ; 
    } 
    지능 m = L +의 연구 >> 1 ; 
    (rson), (LSON) 구축 구축; 
    아웃 [RT]= 병합 (SEG [RT << 1 , SEG [RT << 1 | 1 ]); 
} 
노드 쿼리 ( INT의 L, INT의 R, INT의 L, INT의 R, INT의 실온) {
     경우 (L <= 1 && R> = R) 복귀 SEG [RT];
    INT의 m = L +의 연구 >> 1 ; 
    노드 고해상도; 
    위한 ( int로 I = 0 ; i가 < 5 ; 내가 ++)을 res.dp [I] [I] = 0 ;
    경우 (L <= m) = 입술은 (입술, 쿼리 (L, R, LSON)) 병합;
    경우 (R> m) = 입술은 (입술, 쿼리 (L, R, rson)) 병합;
    반환 입술을; 
} 


INT 의 main () { 
    CIN >> >> N Q; 
    scanf와 ( " %를들 " , + S (1) ); 
    보호구 ( 1 , N); 
    (빌드 1 N, 1 );
    반면 (q-- ) {
         INT의 L, R; 
        scanf와 ( " % d 개 %의 D ' , L, R); 
        L = N-L + 1 , R = N-R + 1 ; 
        노드 입술 = 질의 (R, L, 1 N, 1 );
        만약(res.dp는 [ 0 ] [ 4 ] == INF) 
            (풋 " -1 " );
        다른 COUT << res.dp [ 0 ] [ 4 ] << ENDL; 
    } 
}

 

추천

출처www.cnblogs.com/zsben991126/p/11489107.html