간격 계수 문제

만약 시퀀스를주고, 각 숫자는 컬러 간격의 값에 기여 색의 수, 색상은 N 개의 * (N + 1) / 2의 기여도 값 간격 요청, 1부터 n까지의 정수로 표현된다를 갖고 무엇; N <= 1E5;

 

#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream>
 사용  스페이스 성병;
CONST의  INT maxn 1E5 + = 10 ;
int로 A [maxn], [maxn] 미리, N; 
타입 정의  LL; 
LL 합, ANS; 
INT 의 main () 
{ 
    는 scanf ( " %의 D ' , N);
    위한 ( int로 I = 1 (scanf와 단계; 내가 ++; 나는 = N <) " 가 % d " , & A [I]);
    대한 ( INTI = 1 ; i가 = <N; i가 ++ ) 
    { 

        합계 + = I- 사전 [A [I]; 
        ANS + = 합; 
        예비 [A [I] = I;
        // COUT << 합 << ''<< ANS << ''<< 프리 [A [내가] << ENDL; 
    } 
    의 printf ( " %의 LLD " , ANS);
    반환  0 ; 
}

O (n)은 현재의 플러스 그 기부의 숫자 앞의 마지막 갱신되지 않기 때문에, 현재의 컬러의 첫번째 발생의 위치를 ​​기록하는, 오른쪽 점을 열거하지만, 이들 플러스 수와 현재의 개수 구성 범위 플러스 기여를 반복하지 주어진,

이 합계에서 그렇게 그들 가운데 몇 수와 결합하기 전에 오른쪽 끝 지점의 모든 부분에 대한 기여의 기록이다;

+ 합계 나 미리 [A [I] 가리 오른쪽 모든 전류 기여에 부의 단부, ANS 플러스 충분한;

합을 계산할 때 실제로 순환 프로세스가 모든 계산 적절한 노드와 현재 위치에 기초하고, 모든 기여 간격은, 서로 간격의 우측 종단점 현재 시점보다 이전 서로를 고려하지 않아도

당신이 정말로 (I 조금 몽골이) 말을 이해하지 못한다면, 그것은 또한 다음과 같이 작성할 수 있습니다 :

 

INT 의 main () {
     // freopen을 ( "in.txt", "R", 표준 입력); 
    (n)를 판독;
    위한 ( int로 I = 1 ; 나는 <= N; ++ i가 ) 판독 (a [I]);
    위한 ( int로 I = 1 ; i가 = N <; 내가 ++) DP가 [I] DP가 = [I- 1 ] + I-마지막 [A [I] 마지막 [A [I] = I;
    위한 ( int로 I = 1 ; i가 <= N; 내가 ++) ANS + = DP [I]; 
    COUT << ANS << ' \ n을 ' ;
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/WHFF521/p/11519520.html