[링크] 게임 http://59.61.75.5:8018/contest/218
그리고 A.
[제목] 이탈리아
트리 $ $ A N- 포인트가 보유 $ N-1 $ 에지 각각 $ (u_1, v_1) (u_2, v_2) \ cdots (U_ {N-1}, V_ {N-1} ) $를 처음 U $ $ 각 지점에 대해,이 설정 $ S_u = \ {U \} $.
이 $ m $ 작업, $ I $ $ 주어진 $ P_i의의 조작 $ S_ {U_ {p_i}} $ 및 $ S_ {V_ {p_i}} 그들과 할당 $.
I \ 모두 $ 모든 작업 종료 후, [1, N] $는 $ I $ 요청 집합의 개수를 포함한다.
데이터 범위 [] $ N, m \ 르 5 \ 시간 10 ^ 5 $한다.
[설명]
이 계산 될 때 각 점을 고려하십시오. 물론, 각 블록에있어서, 그 통신의 동작에 영향을 미친다. 역순 처리의 동작, 클릭 통계.
효율성의 $ O (m + n)은 $. 기대 점수 : 100.
[코드]
1 #INCLUDE <. 비트 / stdc ++ H> 2 INT N, m, u는 [ 500,010은 , V는 [ 500,010은 , [S 500,010을 , 브로 [ 500,010 ], Q [ 500,010 ]; 3 ) (주 체결 4- { 5 는 scanf를 ( " % D % D " , 및 N, m); 6 대 ( INT 나 = 1 ; i가 <N; I ++)는 scanf는 ( " % D % D ' , U [I], V [I]); 7 대 ( INT 난 = 1 ; 나는 <= N; 나는 ++) S [I] = 1 ; 8 위한 ( INT 난 = 1 는 scanf (; I <= m I ++) " 가 % d " , Q [I])를; 9 대 ( INT (X) = Q [I] s가 [U [X] = S [V [X] = S [U [X] + S [V], 난 - I I = m, X) [X] - 브로 [X], 발 [X] = S [U [X]; 10 대 ( INT 나 = 1 ; i가 <= N; I ++)의 printf ( " % D % C " s가 [I], " \ n " [I == N]); 11 반환 0 ; 12 }
C. 관리
[제목] 이탈리아
기사 $ $ N 번째 행은 제 문서 정확히 $ K $의 비어 있지 않은 부분으로, 구분 I에게 $ A_I의 $ $ 오른쪽 값 $ 동일한 세그먼트 A_I $ $ $ 동일한 튜플 (I 그래서 , j)를 가능한 한 적게는 $. 즉,이 값 $ $ $ I $ J 문서의 오른쪽 부분에서 가정은 $ C (I, J) $ 일이있다 최소화주세요 $ \ 합계 \ limits_ ^ K \ 합계 \ limits_ {{난 = 1} J} \하기 Binom {C (I, J)} {2} $.
数据 范围】 【$ 2 \ n \ 10 ^ 5 \ 1 \ 및 K \와 \ 분 \ {N, 20 \} \ 1 \ 및 A_I \ n $.
[설명]
$ DP의 $를 생각해 보자. $ 제공자의 F는 [I] [J] $ $ I $ 전면을 나타내는 세그먼트 $ K $의 최소 개수로 나누어진다. 있다 : $의 F [I] [J] = \ 분 \ limits_ {0 \ 당량 K <I} (F [K] [J-1] + W (K + 1, I))은 $.
$ K $ 작은 사람 $ K $ 위해, 즉 $ J $으로 각 층의 전사, 슬라이싱을 알 수있을 것이다.
플레이 테이블은 의사 결정 단조을 발견. 우리는 분열과 정복의 단조 로움과 의사 결정 과정을 고려, 포인터 또는 단조로운 큐와 특정 상황을 유지할 수 없습니다.
(L, R) $ 승 $을 계산하는 방법을 고려한다. (L-1, R) $ 위치 등에 승 $ 푸시 승 $ (L, R) $으로부터 명백해질 것이다. 따라서, 유사한 MO 팀 접근 방식을 유지합니다.
효율 O (NK \ 로그 n)이 $ $. 기대 점수 : 100.
1 #INCLUDE <비트 / stdc ++ H.> 2 CONST 긴 긴 INF = 1LL << 60 ; 3 INT N, K, CNT [ 100010 ]이 [ 100010 ], PL, PR; 4 긴 길이 를 f [ 100010 ] [ 22 ] 입술; 5 인라인 무효 인 ( INT의 X, INT V) {RES- = 1LL * CNT [X] * (CNT [X] - 1 ) / 2 ; CNT [X] + = V] 입술 + = 1LL * CNT [X] * (CNT [X] - 1 ) / 2 ; } 6 인라인 공극 (해결 INT의 L,INT의 R, INT L, INT R, INT의 K) 7 { 8 INT 중간 = (L + R) >> 1 ; 9 일 동안 (PL> L + 1 ) 인 (a [- PL, 1 ); 10 동안 (PR <MID) 인 (a [++ PR, 1 ); 11 일 동안 (PL <L + 1 ) 인 (a [PL ++] - 1 ); 12 동안 (PR> MID) 인 (a [PR -] - 1 ); 13 INT p = L; 긴 긴 ANS = [L] F [K- 1 ] + 입술; 14 일 동안 (PL <= 중간 및 PL <= R + 1 ) 15 { 16 의 경우 (F [pl- 1 ] [K- 1 ] + 입술 <= ANS) ANS = F [pl- 1 ] [K- 1 ] + 입술, p = pl- 1 ; 17 인 (a [PL ++] - 1 ); 18 } 19 F [미드] [K] = ANS; 20 의 경우 (L <= 미드 1 (L, 중간 해결) 1 , L, P, K); 21 일 경우 (MID + 1 <= R) - (+ 중간 해결 1 , R, P, R, k)를; 22 } 23 서명의 main () 24 { 25 는 scanf ( " % D % D " , 및 N, K); 26 대 ( INT 나 = 1 ; i가 <= N; I ++)는 scanf ( " %의 D " , & A [I]); 27 대 ( INT 난 = 0 ; i가 <= N; I ++) 대 ( INT J = 0 ; J <= K, J ++)를 F [I] [J] = INF; 28 F [ 0 ] [ 0 ] = 0 ; 29 대 ( INT J = 1; J <= K, J ++ ) 30 { 31 입술 = 0 ; PL = 1 ; PR = N; 32 대 ( INT 나 = 1 ; i가 <= N; I ++) CNT [I] = 0 ; 33 대 ( INT 나 = 1 ; I <= N; I ++) 인 (A [i]는, 1 ); 34 (해결 1 , n은 0 , N- 1 , J); 35 } 36 리턴 의 printf (! " %의 LLD \ n " , F [N] [K]); 37 }