luogu P4513 화이트 2019년 8월 2일 공원

2019년 8월 2일 
// AndyZ 의해 #INCLUDE <cstdio> #INCLUDE <iostream> #DEFINE RINT 등록 INT #DEFINE LS P << 1 #DEFINE 중계국 P << 1 | 1 네임 스페이스를 사용하여 표준; CONST INT의 N = 5e5 + (5); INT의 N, m; A [N]을 int로; 구조체 SegmentTree { INT의 L, R, DAT; INT의 L 최대, Rmax가, maxn; t} [N * 4; INT ()를 판독 { INT에서 F = 1, X = 0; 숯 CH; 동안 (CH2> '9'|| CH <0) {경우 (CH2 == '-') F = -1, CH = getchar가 ();} 동안 (CH2> = 0 && CH <= '9 ') {X = X * 10 + CH-'0를'; CH = getchar가 ();} 리턴 된 F *의 X; } 공극 팔 굽혀 펴기 (INT의 P) { t [P] .DAT = t [LS] .DAT + t [RS] .DAT; t [P] = .lmax 맥스 (t [LS] .DAT + t [RS] .lmax, t [LS]. t t + .DAT [P] = .rmax 맥스 (t [RS] [LS] .rmax, t [RS]. t [P] .maxn = 최대 (최대 (t [LS] .maxn, t [RS] .maxn) t [LS] .rmax + t [RS] .lmax); } 공극 빌드 (INT의 P, INT의 L, R의 INT) { t [P] 펜닐 = 1, t [P] = R .R; (L == R) {; 창 t [P] .DAT t = [P] .maxn t = [P] .lmax t = [P] .rmax = A [1]} 경우 INT 중간 = (L +의 R) / 2; (LS, L, 중간)를 구축; 구축 (RS, 중간 + 1, R); 팔 굽혀 펴기 (p); } 공극 부가 (INT의 P, INT (X), INT (K)) { 경우 (t [P] 펜닐 == T는 [피] .R) { t [P] .DAT t = [P] .lmax t = [P] .rmax t = [P] .maxn = K; 반환; } INT 중간 = (t [P] 펜닐 t + [P] .R) / 2; (MID> = X)의 경우에는 { (LS, X, k)를 추가; } 다른 추가 (RS, X, K); 팔 굽혀 펴기 (p); } {(INT의 P, INT의 L, R의 INT)을 요청할 SegmentTree (t [P] 펜닐> = L에 &&를 t [P] .R <= R) 복귀 t [P]의 경우; INT 중간 = (t [P] 펜닐 + t의 [P] .R) / 2; (R <= MID)는 창 (LS, L, r)을 구하면; (L> 중간) 반환 (RS, L, R)을 물어 다른 경우; 또 { SegmentTree의 L = (LS, L, r)을 물어, R = (RS, L, r)을 물어, ANS; ans.dat = L.dat R.dat +; ans.lmax = 최대 (L.dat + R.lmax, L.lmax); ans.rmax = 최대 (R.dat + L.rmax, R.rmax); ans.maxn = 최대 (최대 (L.maxn, R.maxn) L.rmax R.lmax +); ANS를 반환; } } INT의 main () { N =) (읽기, m = 판독 (); 대 (RINT I = 1; I <= N; ++ i가) A [i]를 판독 = (); (1,1, N)를 작성; (내가는 <= m; RINT I = 1 난 ++) {대한 INT 옵트 = 읽기 (); 경우 (최적화 == 1) { INT의 판독 A = (), B = () 판독; 경우 (a> b) 스왑 (a, b); 의 printf ( "% D \ 없음"질문 (1, A, B) .maxn); 사용한다} else { INT의 판독 A = (), B = () 판독; (1, b) 추가; } } 0을 리턴; }

  단일 포인트 수정 세그먼트 트리 병합 섹션 + 참고 팔 굽혀 펴기

추천

출처www.cnblogs.com/Ryqwe-csy/p/11290236.html