보고서 문제 해결 "작업 (ODT)의 [SCOI2010] 순서."

원제 주소

물 문제 Keduo 리튬 트리.

 

다음과 같이 코드가 실행된다 :

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE가 긴 긴 int로
 #define한다 IT 설정 <노드> :: 반복자
 #DEFINE의 담당자 (I는 A, B)에 대한 (등록 INT I = (A) 내가 <= (b)] 나 ++) CONST의 INT maxn = 1E5 + (5) ; INT의 N, m;
INT A [maxn]; 구조체 노드 {
     INT의 L, R; 
    변경 가능한 부울 V; 
    노드 ( INT의 L, INT의 R = - 1 , INT의 V = 0 ) : L (L), (R) (R), V (V) {}
     부울 연산자 <(

 



 CONST 노드 O) CONST {
         복귀 L < 올; 
    } 
}; 

설정 <노드> 들; 

INT MAX ( int로 하는 INT의 B) { 반환 A> B를? A : B는} 

int입니다 판독 () {
     INT X = 0 , 플래그 = 0 ;
     CH = '  ' ;
    반면 (! CH = ' - ' && (CH2 < ' 0 ' || CH> ' 9 ' CH =))getchar가 ();
    경우 (CH2 == ' - ' ) { 
        플래그 = 1 ; 
        CH = getchar가 (); 
    } 
    동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) { 
        (X) = (X << 1 ) + (X << 3 ) + (CH ^ ' 0 ' ); 
        CH = getchar가 (); 
    } 
    반환 플래그를? - X : X; 
} 

IT 분할 ( INT의 POS) { 
    IT를= s.lower_bound (노드 (POS));
    경우 (IT = s.end () && IT-> L == POS!) 복귀 를;  - ;
    INT의 L = IT-> L, R = IT-> R, V = IT-> V; 
    s.erase (IT); 
    s.insert (노드 (L, POS - 1 , V));
    반환 s.insert (노드 (POS, R을 V)) 제.; 
} 

무효 지정 ( INT의 L, INT의 R, INT의 발) { 
    IT ITR = 스플릿 (R + 1 ) = ITL 분할 (l); 
    s.erase (ITL, ITR); 
    s.insert (노드 (L, R, 발)); 
} 

무효되돌리기 ( INT의 L, INT의 R은) { 
    IT ITR이 분할 = (R + 1 ) = ITL 분할 (l);
    반면 (! = ITL ITR) { 
        ITL -> V ^ = 1 ; 
        ITL ++ ; 
    } 
} 

INT의 합 ( INT의 L, INT의 R은) { 
    IT ITR이 분할 = (R + 1 ) = ITL 분할 (l);
    INT ANS = 0 ;
    동안 (ITL! = ITR)는 { 
        ANS + = itl-> V? itl-> R - itl-> L + 1: 0 ; 
        ITL ++ ; 
    }    
    반환 ANS; 
} 

INT con_sum ( INT L, INT의 R은) { 
    IT ITR이 분할 = (R + 1 ) = ITL 분할 (l);
    INT ANS = 0 , 지금 = 0 ;
    동안 (ITL =! ITR) {
         경우 ((itl->! {V)) 
            ANS = MAX (ANS, 지금); 
            지금 = 0 ; 
        } 
        다른 지금 + = itl-> R - itl-> L + 1; 
        ITL ++ ; 
    } 
    반환 MAX을 (ANS, 지금); 
} 

공극 쓰기 ( INT의 X) {
     경우 (X < 0 ) { 
        putchar ( " - " ); 
        X = - (X); 
    } 
    경우 (x> 9 ) 기록 (X / 10 ); 
    putchar (X의 % 10 + ' 0 ' ); 
} 

) (주 서명 { 
    N , m =) (= 판독 ) (판독; 
    렙 (I, 0 , N -1 ) { 
        A [내가] = 읽기 (); 
        s.insert (노드 (I, I, A [I])); 
    } 
    s.insert (노드 (N, N, 0 )); 
    렙 (I, 1 , m) {
         INT의 L, R, 선택; 
        해제 , R은 = () = 1 판독) (= 판독 ) (판독;
        경우 지정 (L, R, (옵트!) 0 );
        다른  경우 (최적화 된 == 1 ) 할당 (L, R, 1 );
        다른  경우 (최적화 된 == 2 ) 되돌리기 (L, R);
        다른  경우 (옵트의 == 3 ) {
            물품 (SUM (L, R)); 
            의 printf ( " \ n을 " ); 
        } 
        다른 { 
            쓰기 (con_sum (L, R)); 
            의 printf ( " \ n을 " ); 
        } 
    } 
    반환  0 ; 
}
코드보기

추천

출처www.cnblogs.com/Kirisame-Marisa/p/11364393.html