NOIP 시뮬레이션 테스트 (11) "문자열 · 매트릭스 · 큰."

큰 약간의 문제를 히트, MAXX 나는 초기 0의 값을 10 점 이하로 설정

두 번째 타이틀 싸움 폭력 튀김

첫 번째 질문은 여전히 ​​40 점 몇 가지 쓸모없는 가지를 잘라

총 70

이것은 실패한 시험은

그리고 그 순서 같은 질문의 생각하지만, 내가 순서를하지 않았다, 시험 방은 성공하지, 노인 강의를 회상했다. 마지막으로, 내 입 후 CDQ 파티션, 46 수정 한 후, 다음 사실은 56 변경하지 마십시오 (56) 전 지사 등의 수정을 많이 줄일 수있을 것입니다.

이 아이디어 준수, 나는 아직도 그 다음, 40 점을 나누기를 연주하고 정복 무료입니다.

문제 해결

우리는 먼저 배럴을 찾아 물어 항상 배럴을 유지, 문자의 수를 각 섹션의 범위를 유지할 수 있습니다, 우리는 반대 순서로 다음 순서를 분류 할 때, 알파벳 순서 변경의 범위를 (26)을 열거하고, 수 차례에 잘 열거 . 따라서 수정 동작 간격의 복수의 수정. 그러나 우리는 유지 보수가 잘 유지되지 않습니다, T을 할 것입니다, 우리는 또한 다른 특별한 자세가 필요 게으른 라벨이 매우 아픈의 다양한

    경우 (TR [P] .A)의 TR [피 << 1] .A TR = [P] .A, TR [P << 1 | 1] .A TR = [P] .A;

이렇게하려면 아들을 수정하고 재귀 노드하도록 요청하지만, 우리는 또한 유지 보수 시간 게으른 마크를 절약 할 것

그래서 우리는 유지하는 방법에 대해 생각

때 수정

    경우 (TR [P] 펜닐> = 1 && TR [P] .R <= R || TR [P] == .A X) { 
        TR [P] .A =의 X;
        반환 ; 
    }

간격이 완전히 적용되지 않는 경우

    경우 (TR의 [피] .A) TR [P << 1] .A TR = [P] .A, TR [P << 1 | 1] .A TR = [P] .A, TR [P]. A = 0;

코드

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE가 긴 긴 것이다
 #define한다 1,010,101
 구조체 트리 { 
    LL의 X, F, A, L, R을; 
TR} [A]; 
문자 S [A]; 
LL w [A]; 
LL의 N, m; 
지도 <LL, 문자 > MP;
무효화 내장 (LL의 P, LL의 L, LL의 R) { 
    그럴 [피] 펜닐 = 1, TR [P] = .R R 단계;
    경우 (L == R) {
 //         의 printf ( "L = S %의 LLD = % LLD \ 없음 ', L, S [1] -'A '+ 1ll); 
        = s의 [1,5] .A 그럴 [P] - ' ' + 1 ;
        반환 
    } ;
    LL 중간 = (L +의 연구) >> 1 ; 
    내장 (p << 1 , L, MID); 
    내장 (P << 1 | 1 , 중반 + 1 , R);
    경우 (TR의 [피 << 1 ] == .A TR [P << 1 | 1 ] .A) 
        TR [P] .A = TR [P << 1 ] .A; 
} 
공극 getsum (LL의 P, LL의 L, LL의 R) {
 //     의 printf ( "L = %의 LLD의 R = %의 LLD의 L = %의 LLD의 R = %의 LLD 그럴 [P] .A = % LLD n \"TR의 [ P] 펜닐, TR [P] .R, L, R, TR [P] .A); 
    경우 (TR [P] 펜닐> = 1 && TR [P] .R <= R && TR [P] .A) { 
        w [TR [P] .A] + = (TR [P] .R-TR [P] .);
        반환 ; 
    } 
    LL 중간 = (TR [P] 펜닐 TR + [P] .R) >> 1 ;
    경우 (TR [P] .A)의 TR [피 << 1 ] .A TR = [P] .A, TR [P << 1 | 1 ] .A = TR [P] .A;
    경우 (MID> = l) getsum (p << 1 , L, R);
    경우 (MID <R) getsum (p << 1 | 1 , L, R); 
} 
공극 변화 (LL의 P, LL의 L, LL R, LL의 X) {
 //     의 printf ( "L의 LLD = % R = %의 LLD *** \ n을"L, R); 
    경우 (TR [P] 펜닐> = 1 && TR [P] .R <= R || TR [P] == .A X) { 
        TR [P] .A =의 X;
        반환 ;
    }= (TR의 [피] 펜닐 TR + [P] .R) >> 1 ;
//     의 printf ( "TR [%의 LLD = %의 LLD의 \ n", P, TR [P] .A);    
    경우 (TR [P] .A)의 TR [피 << 1 ] .A TR = [P] .A, TR [P << 1 | 1 ] .A TR = [P] .A, TR [P] .A = 0 ;
    경우 (MID> = l)의 변화 (p << 1 , L, R, X);
    경우 (MID <R)의 변화 (p << 1 | 1 , L, R, X); 
} 
무효화  아웃 {(LL 피)
 //     의 printf ( "p = %의 LLD 그럴 [P] .A = %의 LLD MP = %의 C \ 없음", P, TR [P] .A, MP [TR [P]. 에이]); 
    경우 (TR [P] .A) {
          (LL I = 1 ; I <= TR [P] .R-TR [P] 펜닐 + 1; 나는 ++ ) 
            의 printf ( " %의 C " ( ) MP [TR [P] .A])를;
        반환 ; 
    } 
    아웃 (p << 1 );
    아웃 (p << 1 | 1 ); 
} 
보이드 프리 () {
      (LL I = 1 ; i가 = < 26 ; I ++ ) 
        MP에 [I] = ' ' + I- 1 ;
    반환 ; 
} INT 의 main () { 
    프리 (); 
    는 scanf ( " % LLD % LLD
 ", N, m); 
    scanf와 ( " %를들 " , + S (1) ); 
    내장 ( 1 , 1 , N);
    대해 (LL I = 1 , A, B, C, T, I는 <= m; 내가 ++ ) { 
        는 scanf ( " % LLD % LLD % LLD ' , A, 및 B, 및 C);    
        getsum ( 1 , A, B); 
        LL의 L은 = a 및
        경우 (c) {
              (LL의 t = 1 , t <= 26 ; t ++ )
                 경우 (w [t]) 
                    의 변화 ( 1[t] w, 1,1-의 + - 1 , t), L = L + w [t], [t] w = 0 ; 
        } 
        다른 {
              (LL의 t = 26 ; t> = 1 ; t-- )
                 경우 (w [t]) 
                    의 변화 ( 1 , L, L + w [t] - 1 , t) w, L = 리터 + [ t], w [t] = 0 ; 
        } 
    } 
    아웃 ( 1 ); 
    풋 ( "" ); 
}

 

추천

출처www.cnblogs.com/znsbc-13/p/11286426.html