첫째,이 고정 시작점 $의 S $으로 유명 할 수는 결국 특정 기간의 끝에 올은 간격
이것은이 점을 중심으로 합법적 인 브레이크 포인트 간격이 끝 지점으로 사용 될 수 있다는 것을 가정 모순에 의해 증명하기 쉽다
그런 논의하기 위해 왼쪽과 오른쪽 출발점의 시작 부분에 섹션 중단 점으로 구분, 출발점은 명확해야 그 말 자체
그리고 지금까지의 출발점은 답을 계산하기 위해 왼쪽과 오른쪽 위치의 각각에서 올 수있는
첫번째 우측 고려 (편의를 위해를 내가 시간을 $ 첫 $ 내가 처음 일을 $ $ 요구 될했다)
그냥 다음 위치를 물어 가야했다 일일 만날 때까지 우리는 항상 오른쪽으로 갈 수는 $ X를 $의 시작점을 설정하고 시간이 한 번 중지됩니다
이 상황이 발생할 - 일 $ y를 $를 위해 걷는 설정 한 다음이 $ X + Y = a는 [Y]를 $는, 즉, $ x는 [Y]를 = -y $, 우리는 다음 $를 찾을 완료 후 단계를 기다립니다 그래서 Y의 $을 $ X + Y = 1 + A [Y] $
세트 $의 F (x, y)는 $는 극우만큼 계산 $ f (x, y)를 같이 $ 바로 첫 번째 정지 위치는 다음하게 도달 출발 $ X $ - 일로부터 제 $ y는 $의 위치를 나타내는 올바른 위치는 하위 문제 일 점점 더 많은되었다
(Y + Z) $ - 제공자 $ z는 $ 만족 최소 $의 X + Z = A [Y + Z] $ 번호는 다음 전환은 약 $ XY = A [Y + Z]에 상당
첫 번째 정류장은 분명히 올바른 위치는 $ 첫째 $ A [i]를 -i $ 문의 왼쪽 미래의 현재 시간에 유지 달러 (A $)의지도, 거꾸로 하나를 생각하는 시간만큼 유지 될 수있다
위치가 단지 [내가] -1 $을 $ 경우에만 시간이 한 번 중지 할 때, $ i가 $ 것을주의하는 동안, 우리는 위치를 알고 싶어하고 시간을 유지할 수 있습니다 만, 시간에 대해 물어 것
그것은 내가 열거 내림차순 $ $ 이때 귀결, I $는> $ j를 현재의 최소값에 $ 맵 $ 정비 제시되도록 $ A [J] -j == (a [I] -1) - 나는 $
그럼 당신은 $ i가 $ 계속 걷는 하루 만에 정지 $ R [내가] $ 바로 바로 시간에 표현 찾아서 맨 오른쪽 ($ R [내가] = R [J] $, $ j를 = 맵 [갔다 수 있습니다 (a [I] -1) -i] $, 전송의 시점을 찾는 것을 의미하는 정지)
더 $ 맵 $가없는 경우는 물론, 법적으로 일본을 $ $, 다음 멈추지 않는 시간의 끝으로 이동
왼쪽이 같은 관행이에, 그것에 대해 생각 이상으로 자신을 밀어 배울
실제로 한 인덱스가 공동으로 $의 m의 $를 추가 할 수있는 버킷 대체 할 수 $ $를,지도
참조 코드 : Farhod_Farmon
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <알고리즘> #INCLUDE <CString을> #INCLUDE <cmath> #INCLUDE <지도> 사용 스페이스 성병; 타입 정의 긴 긴 LL; 인라인 INT의 읽기 () { INT (X) = 0 , F = 1 ; 숯 CH = getchar가 (); 동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 경우 (CH2 == ' - ' ) F = - 1 ; CH = getchar가 (); } 동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) {(X) = (X << 1 ) + (X << 3 ) + (CH는 ^ 48 ); CH = getchar가 (); } 리턴 의 X *의 F 단계; } CONST의 INT N = 1E5 + 7 ; INT의 N, M, A [N], L [N], R [N]; 지도 < INT , INT > ㎖, 씨; 인라인 INT find_r ( INT X, int로 ⅰ) { 반환 씨 [XI]을? R [MR [XI] : 분 (X + (MI) + 1 , N); } 인라인 INT find_l ( INT X, int로 I) { 복귀 ML의 [X + I]? L [ml의 [X + I] : 최대 (X- (MI) - 1 , 1 ); } int로 ) (메인 { N =) (읽기, m = ) (판독; 위한 ( int로 난 = 1 A [내가] = 내가 ++; I <= m) ) (판독; 경우 (N 개의 == 1 () {printf와 " 0 \ n " ); 반환 0 ; } 에 대해 ( int로 I = m의 단계; I> = 1 , 난 - ) { L [내가] = find_l (A [i]는 + 1 , I); R [I]를 find_r = (A [I] - 1 , I); 용액 [A [I] + I] = 1; 씨 [A [i]는 -i = I; } LL ANS = 0 ; 위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) ANS + find_r = (I, 0 ) -i + . 1 + I-find_l (I는, 0 ); // 시작점은 엔드 포인트로서 +1 기부 자체의 중간 인 의 printf ( " % LLD \ 없음 " , ANS); 반환 0 ; }