우리는 오랜 시간 동안 트리 라인 이론을 공부하고 다시 연주 것을 발견 결과적으로 코드를 이해
간단히 말해, 세그먼트 트리를 기반으로 편집을 할 수있는 간격의 파티션, 그것은 높은 시간 효율성이다
그런 다음이 코드는 (루오 구 너무 구덩이, 질의 내부도 ans와 개방 오래 오래)
1 #INCLUDE <cstdio> 2 #INCLUDE <CString을> 3 #INCLUDE <iostream> 4 #INCLUDE <알고리즘> 5 이용 스페이스 성병; 6 타입 정의 긴 긴 LL; 7 CONST의 INT N = 1E5 + 5 ; (8) LL의 ADDV는 [N * 4 ] sumv [N * 4 ], A [N]; 9 INT의 N, m; 10 인라인 INT의 판독 () 11 { 12 INT (X) = 0 = w, 1 ; 숯C = getchar가 (); 13 일 동안 (c> ' 9 ' || C < ' 0 ' ) { 경우 (c == ' - ' ) w = - 1 ; C = getchar가 ()} (14) 동안 (c <= ' 9 ' && C> = ' 0 ' ) {(X) = (X << 1 ) + (X << 3 ) + C- ' 0 ' ; C = getchar가 (); } 15 복귀 * w의 X; K) 18 { 19 sumv [K] = sumv [K << 1 ] + sumv [K << 1 | 1 ]; 20 } 21 인라인 공극 빌드 ( INT의 O, INT의 L, INT R) //建树 22 { 23 일 경우 (L이 == R) {sumv [O]는 [1]을 =; 반환 } 24 INT 중간 = (L + R) >> 1 ; //分治操作 25 빌드 (O << 1 , L, MID); 26 빌드 (O << 1 | 1 중간 + 1 , R); (27) 팔 굽혀 펴기 (O) (28) } (29) 보이드 푸시 ( INT의 O, INT의 L, INT R & LT) // 형이상학 푸시 (트리로부터의 조작으로부터 유래) 30 { 31는 IF (ADDV [O] == 0 ) 창 ; 32 ADDV는 [<< O . 1 ] + = ADDV [O] 33 인 ADDV [O << 1. | 1. ] + = ADDV [O] 34 INT MID = (L + R 및 LT) >> . 1 ; 35 sumv [O << . 1 ] + = ADDV [O] * (L + - 중간 1. ) 36 sumv [O << 1.| . 1 ] + = ADDV [O] * (R- MID); 37 ADDV [O] = 0 ; 38이다 } 39 무효 puttag ( INT의 O, INT의 L, INT의 R & LT, V의 LL) // lazytag 동작 지연 마커 (40) { 41은 ADDV [O] + = V] (42)가된다 [O] + = sumv (R & LT-L +를 1. *) V; 43이다 } (44) 인 공극 수정 ( INT의 O, INT의 L, INT R & LT, INT QL, INT QR, LL의 V) 부 수정 // 45 { 46은 IF(QL <= L && QR> = R & LT) {puttag (O, L, R & LT, V) 반환 } 47 INT ANS = 0 , MID가 = (L + R 및 LT) >> 1. ; 48 푸시 (O, L, R & LT) // 푸시 잊지 여기서 49 IF (QL <= MID)를 수정 (O << 1. , L, MID, QL, QR, V) (50) IF (QR> MID)를 수정 (O << . 1 | . 1 , + MID . 1 , R & LT, QL, QR은, V) (51)는 팔 굽혀 펴기 (O) (52)이다 } (53)는 LL 쿼리 ( INT의 O, INT의 L, INT R & LT, INT QL, INT QR) // 조회 부 (54) { 55 의 경우 (QL <= 1 && QR> = R) 복귀 sumv [0]; 56 푸시 (O, L, R); (57) LL의 ANS = 0 ; 58 INT 중간 = (L +의 연구) >> 1 ; (59) 만약 (QL <= MID) ANS + = 쿼리 (O << 1 , L, 중간, QL, QR); 60 의 경우 (QR> MID) ANS + = 쿼리 (O << 1 | 1 중간 + 1 , R, QL, QR); 61 리턴 ANS; 62 } 63 INT 의 main () 64 { 65 , N = 판독 (); m = 판독 (); 66 대 (int로 I = 1 ; 나는 <= N; ++ I) (67) 는 scanf ( " %의 LLD " , & A [I]); 68 빌드 ( 1 , 1 , N); (69) 동안 (M-- ) 70 { 71 INT의 선택 해제, L, R; 72 LL의 발; (73) 선택 해제는 = ) (판독; 74 경우 (최적화 된 == 1 ) L = (판독), R은 = () 읽기는 scanf ( " %의 LLD " , 발), 수정 ( 1 , 1 , N, L, R, 발); 75 다른판독 L = (), R = (읽기)의 printf ( " % LLD \ 없음 " 쿼리 ( 1 , 1 , N, L, R)); 76 } 77 반환 0 ; 78 }
계속하려면 ...