Codeforces 1236E. 앨리스와 불공정 게임

첫째,이 고정 시작점 $의 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 ;
}

 

추천

출처www.cnblogs.com/LLTYYC/p/11706387.html