큰 약간의 문제를 히트, 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 ); 풋 ( "" ); }