난창 (南昌) 네트워크 게임은 원래 제목 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; } }