243 간단한 정수 문제 2를 AcWing | 펜윅 트리

제목 설명

길이 n은 일련의 주어와 M의 설명은, 각각의 명령은 다음 중 하나 일 수있다 :

1 "C의 LRD"는 A [L], A [L + 1], ..., A [R]을 더한 D이다 나타낸다.

2 'Q의 LR은 "L의 개수를 나타낸다 ~ R 및 심문 열 번호.

각 질문의 경우, 출력 정수 대답.

입력 형식

두 정수의 제 N 라인, M.

n 개의 번째 행은 A [I]의 정수.

M은 M 행을 다음 명령어 피사체 설명에서와 같이 각각의 명령 포맷을 나타낸다.

출력 형식

각 질문의 경우, 출력 정수 대답.

줄에 각각의 대답.

데이터 범위

1 N , M 10 5 1≤N, M≤105,
| D | 10000 | D | ≤10000,
| [ I ] | 1000000000 | A [I] | ≤1000000000

샘플 입력 :

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4

샘플 출력 :

4
55
9
15

 

해결 방법 : 우리는 펜윅 트리의 기본적인 사용이 접두사 및 업데이트의 순서뿐만 아니라 단일 지점을 유지하는 것입니다 알고있다. 우리는 어레이 B의 배열을 변경하는 보수 업데이트의 단일 값을 가리킬 수 있고, A [i]는 B 프리픽스 배열이 획득 될 수 있고 갱신 된 값이 [I] . 그럼 우리는 어떻게 간격과 업데이트 뒤에 계산합니까? 우리는 접두사와 추구에 해당하는 배열 [~ X 1] 발견 , 그가로 기록 될 수 있습니다 :

  

 

그럼 내가 B [I] 및 접두어 *는 C를 유지하도록 배열을 재사용 할 수있다. 다음, 필수가되는 문제 (총합 (R) + (R + 1) * 쿼리 (B, R) - 쿼리 (C, R)) - (합 [L-1] + L * 쿼리 (b, L-1 ) - 쿼리 (C1, L-1))

코드 :

#INCLUDE <. 비트 / stdc ++ H>
 #DEFINE가 긴 긴 줄게
 #DEFINE의 LL ULL 부호를
 이용하여  스페이스 성병;
CONST의  INT N = + 1E5 (10) ;
CONST   EPS 1e- = 8 ; 
LL A [N], 3 [ 2 ] [N], 합계 [N];
INT lowbit ( INT X) { 복귀 , X (- X)}
 공극 추가 ( INT의 K, INT (X), INT의 Y) {
     동안 (X < N) { 
        C [K] [X] + = Y; 
        X + =lowbit (X); 
    } 
} 
LL 쿼리 ( INT의 K, INT의 X) { 
    LL ANS = 0 ;
    반면 (X) { 
        ANS + = C [K] [X]; 
        X - = lowbit (X); 
    } 
    반환 ANS; 
} 
INT 의 main () {
     INT의 N, M, L, R, X;
    문자 S [ 5 ]; 
    scanf와 ( " %의 D % d에 " , N, m);
    위한 ( int로 I = 1 ; I ++는, 난 <= N ) { 
        (는 scanf" %의 LLD " , & A [I]); 
        합 [내가] = 합계 [I- 1 ] + A [I]; 
    } 
    동안 (M-- ) { 
        는 scanf ( " %의 S ' , S);
        경우 (S [ 0 ] == ' Q ' ) { 
            는 scanf ( " % d 개 %의 D ' , L, R); 
            LL ANS = 합 (R) + (R + 1 ) * 쿼리 ( 0 , R) - 쿼리 ( 1 , R); 
            ANS - 합계 = [1- 1 ] + L * 쿼리 ( 1 , 1-1 ) - 쿼리 ( 1 , 1- (1) ); 
            의 printf ( " % LLD \ 없음 " , ANS); 
        } 다른  경우 (S [ 0 ] == ' C ' ) { 
            는 scanf ( " % D % D % D ' , L, R, X); 
            추가 ( 0 , L, X); 
            추가 ( 0 , R + 1 - X); 
            추가 ( 1 , L, L 개의 * X); 
            추가 ( 1 , R + 1 , - (R + 1 ) * X);
        } 
    } 
    반환  0 ; 
}
코드보기

 

 

 

추천

출처www.cnblogs.com/l999q/p/11348178.html