공원의 P4513 흰색 동적 유지 보수 및 가장 큰 이하 세그먼트

항목 링크 : HTTPS : //www.luogu.org/problem/P4513

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <알고리즘>
 사용  스페이스 성병;
#DEFINE maxn 500,005
 #DEFINE 줄게 긴 긴
 #DEFINE의 LS 리터 미드, RT << 1
 #DEFINE RS 미드 + 1, R, RT << 1 | 1 개
 구조체 노드 { 
    LL 합, lsum, rsum, msum; 
} TR [maxn << 2 ]; 
LL A [maxn]; 
인라인 공극 팔 굽혀 펴기 ( INT의 RT) 
{ 
    TR [RT] .sum = TR [RT << 1 ] .sum + TR [RT << 1 | 1 ] .sum; 
    TR [RT] .lsum = 최대 (TR [RT <<1 ] .lsum, TR [RT << 1 ] .sum + TR [RT << 1 | 1 ] .lsum); 
    TR [RT] .rsum = 최대 (TR [RT << 1 | 1 ] .rsum, TR [RT << 1 | 1 ] .sum + TR [RT << 1 ]을 .rsum); 
    TR [RT] .msum = 최대 (최대 (TR [RT << 1 ] .msum, TR [RT << 1 | 1 ] .msum) TR [RT << 1 | 1 ] .lsum + TR [RT < < 1 ] .rsum); 
} 
인라인 공극 빌드 ( INT의 L, INT의 R, INT의 RT) 
{ 
    경우 (L ==R) 
    { 
        TR [RT] .sum = TR [RT] .msum = TR [RT] .lsum = TR은 [RT] .rsum는 = A [L]을;
        반환 ; 
    } 
    INT 중간 = L + R >> 1 ; 
    (LS)를 구축 (RS)를 구축; 
    팔 굽혀 펴기 (RT); 
} 
인라인 공극 업데이트 ( INT의 L, INT의 C, INT의 L, INT의 R, INT의 RT) 
{ 
    경우 (L == R) 
    { 
        TR [RT] .sum = TR [RT] .msum = TR [RT] .lsum = TR [RT] = .rsum의 C;
        반환 ; 
    } 
    INT 중간 = L + R >> 1;
    경우 (L <= MID) 업데이트 (L, C, LS);
    다른 업데이트 (L, C, RS); 
    팔 굽혀 펴기 (RT); 
} 
인라인 노드 쿼리 ( INT의 L, INT의 R, INT의 L, INT의 R, INT의 RT) 
{ 
    경우 (L <= 1 && R> = R) 복귀 TR [RT];
    int로 중간 = L + R >> 1 ;
    경우 (R <= MID) 리턴 질의 (L, R, LS);
    다른  경우 (L> 중간) 반환 쿼리 (L, R, RS);
    
    { 
        노드 WL = 쿼리 (L, R, LS) = WR쿼리 (L, R, RS) ANS; 
        ans.lsum = 최대 (wl.lsum, wl.sum + wr.lsum); 
        ans.rsum = 최대 (wr.rsum, wr.sum + wl.rsum); 
        ans.msum = 최대 (최대 (wl.msum, wr.msum) wl.rsum + wr.lsum);
        반환 ANS를; 
    } 
} 
INT 의 main () 
{ 
    INT의 N, m; 
    scanf와 ( " %의 D % d에 " , N, m);
    위한 ( int로 I = 1 ; i가 ++; 나는 <= N ) 
    (scanf와를 " %의 LLD를 " , & A [I]); 
    (빌드 1 , N, 1);
    INT의 OP, L, R, X;
    위한 ( int로 I = 1 ; I <= m; 내가 ++ ) 
    { 
        는 scanf ( " %의 D " , OP);
        경우 (연산 == 1 ) 
        { 
            는 scanf ( " % d 개 %의 D ' , L, R);
            경우 (L> R) - 스왑 (L, R); 
            의 printf ( " % LLD \ 없음 " 쿼리 (L, R, 1 N, 1 ) .msum); 
        } 
        다른 
        { 
            scanf와을 ( "% D % D ' , L, X), 
            업데이트 (L, X, 1 N, 1 ); 
        } 
    } 
    리턴  0 ; 
}

 

추천

출처www.cnblogs.com/chen99/p/11388859.html