팁 + 폭력

http://acm.hdu.edu.cn/showproblem.php?pid=4027

이러한 쿼리에 응답 할 수 있습니까?

시간 제한 : 2,000분의 4,000 MS (자바 / 기타) 메모리 제한 : 65,768분의 65,768 K (자바 / 기타)
총 제출 (들) : 33,385 허용 제출 (들) : 8020


문제 설명
악마의 전함의 많은 전투 전에 일렬로 배열되어있다. 우리의 사령관은 전함을 제거하기 위해 우리의 비밀 무기를 사용하기로 결정. 전함 각각 내구성의 값을 표시 할 수있다. 우리의 비밀 무기의 모든 공격의 경우, 지구력이 원래 값의 제곱근에 자신의 지구력을하여 전함의 연속 부분의 내구성을 줄일 수 있습니다. 우리의 비밀 무기의 공격의 일련의 동안, 사령관은 무기의 효과를 평가하고자하는, 그래서 그는 도움을 요청합니다.
당신은 전함 라인의 연속 부분의 내구성의 합이 그 쿼리에 응답하라는 메시지가 표시됩니다.

제곱근 연산이 정수로 반올림해야 알 수 있습니다.
 

 

입력
입력은 EOF로 종료 몇 가지 테스트 케이스가 포함되어 있습니다.
  테스트 케이스를 들어, 첫 번째 행은 행 내의 악의 N 전함 거기 나타내는 단일 정수 N을 포함한다. (1 <= N <= 100,000)
  의 두 번째 줄은 정수 N 에이 끝까지 라인의 시작에서 각 전함의 내구성을 나타내는 값이 포함되어 있습니다. 당신은 모든 인내 값의 합이 2보다 작은 것으로 가정 할 수있다 (63) .
  다음 줄은 행동과 쿼리 수를 나타내는, 정수 M이 포함되어 있습니다. (1 <= M <= 100000)
  다음 M 라인은 각 라인은 포함 세 정수 T, X 및 Y. T = 0 X 번째 및 Y 번째 전함 사이 전함 내구 값을 감소 병기의 작용을 나타내는 포함 . X 번째 및 Y-번째까지의 전함의 내구 값의 합을 요청 커맨더의 조회를 나타내는 T = 1.
 

 

산출
각 테스트 케이스를 들어, 첫 번째 줄에 사건 번호를 인쇄 할 수 있습니다. 그런 다음 각 쿼리에 대해 한 줄을 인쇄 할 수 있습니다. 그리고 각 테스트 케이스 후 빈 줄을 따라 기억한다.
 

 

샘플 입력
10 1 2 3 4 5 6 7 8 9 10 5 0 10 1 1 1 10 1 1 5 0 5 8 1 4 8
 

 

샘플 출력
사례 1 : 7 19 6
 

 

출처
 

 

권하다
LCY
 그 루트 개구 6-7 다수 재귀 각 리프를 업데이트하는 다른 상기 업데이트 간격없이 R-L + 1 ==의 발에 대해 1이며, 주목
// #INCLUDE <비트 / stdc ++. H> 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <cmath> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream> 
#INCLUDE <cstdio > 
#INCLUDE < 문자열 > 
#INCLUDE <CString을> 
#INCLUDE <STDIO.H> 
#INCLUDE <큐> 
#INCLUDE <적층> ; 
사용법 #include <지도> 
사용법 #include < 설정 > 
사용법 #include <
#INCLUDE <벡터>
 #define한다 ME (X, Y)가 memset (X, Y는 sizeof (X))
 #DEFINE SF (N)는 scanf ( "%의 D", N)
 #DEFINE에 대한 담당자 (I, n)은 (지능 I = 0; I <N은, 내가 ++)는
 #DEFINE의 0x3f3f3f3f INF
 #DEFINE의 개조 1,000,000,007
 #DEFINE의 PI의 ACOS (-1)
 를 사용  스페이스 성병; 
타입 정의  LL;
CONST의  INT의 N = 100009 ; 
LL 합계; 

구조체 노드 
{ 
    INT의 L, R; 
    발 LL; 
} 트리 [N << 2 ]; 

무효 빌드 (INT의 L, INT의 R, INT의 루트) 
{ 
    트리 [루트] 펜닐 = L, 트리 [루트] .R = R;
    경우 (L == R) 
    { 

        는 scanf ( " %의 LLD " , 트리 [루트] .val);
        반환 ; 
    } 
    INT 중간 = (L + R) >> 1 ; 
    구축 (L, 중간, 루트 * 2 ); 
    구축 (중앙 + 1 , R, 루트 * 2 + 1 ); 
    트리 [루트] .val = 트리 [루트 * 2 ] + .val 트리 [루트 *2 + 1 ] .val; 
} 

공극 업데이트 ( INT의 L, INT의 R, INT의 루트) 
{ 
    경우 ((트리 [루트] 펜닐> = 1 && 트리 [루트] .R <= R) && (트리 [루트] .R - 트리 [루트] .L + 1 > = 트리 [루트] .val)) 
    { 
        리턴 ; 
    } 
    경우 (트리 [루트] 펜닐 == 트리 [루트] .R) 
    { 
        트리 [루트] .val = SQRT (트리 [루트] .val);
        반환 ; 
    } 
    INT 중간 = (트리 [루트] 펜닐 + 트리 [루트] .R) >> 1 ;
    경우 (L <= MID)
        업데이트 (L, R, 루트 * 2 );
    경우 (R> MID) 
        업데이트 (L, R, 루트 * 2 + 1 ); 
    트리 [루트] .val = 트리 [루트 * 2 ] + .val 트리 [루트 * 2 + 1 ] .val; 
} 

공극 getsum ( INT의 L, INT의 R, INT의 루트) 
{ 
    경우 (트리 [루트] 펜닐> = 1 && 트리 [루트] .R <= R) 
    { 
        합계 + = 트리 [루트] .val;
        반환 ; 
    } 
    INT중간 = (트리 [루트] 펜닐 + 트리 [루트] .R) >> 1 ;
    경우 (L <= MID) 
        getsum (L, R, 루트 * 2 );
    경우 (R> MID) 
        getsum (L, R, 루트 * 2 + 1 ); 
    
} 

INT 의 main () 
{ 
    INT의 N, m;
    INT CNT = 0 ;
    동안 (~는 scanf ( " %의 D ' , N)) 
    { 
        의 printf ( " 케이스 # 1 %의 D : \ n " , ++ CNT); 
        (빌드 1N, 1 ); 
        scanf와 ( " %의 D ' , m);
        위한 ( int로 I = 0 ; I <m은, 내가 ++ ) 
        { 
            INT는  이고 , L, R; 
            scanf와 ( " % D % D % D " , 이며 , L, R);
            경우 (L> R) - 스왑 (L, R); // 注意坑
            경우 (  == 0 ) 
            { 
                업데이트 (L, R, 1 ); 
            } 
            다른 
            { = 0 ; 
                getsum (L, R, 1 ); 
                의 printf ( " % LLD \ 없음 " , 합); 
            } 
        } 
        COUT << ENDL; 
    } 

    반환  0 ; 
}

 

추천

출처www.cnblogs.com/nonames/p/11606307.html