POJ3321 사과 나무 (펜윅 나무)

가장 중요한 부모 노드와 같은 노드의 수, 우리는 나무이 기록 노드와 그가 시작 끝 노드를 DFS있는 수요가 있었다 전에 DFS 두 지점 사이 일 정도로 길고,이 제목을 주문입니다 라인에 DFS

첫째, 트리 구조를 저해하지 않고, 둘째, 그는 또한 상기 해당 펜윅 트리 매우 일반적인 기술이다 각 노드 간의 상대적인 관계

당신은 g ++ 사용하려는 경우 Benpian 유료로 C ++ 코드를 요구, 필요 특히 평가 시스템을 POJ마다 급여의 문제, 최고의 C ++ 크로스, 어쨌든, 나는 특정 원리를 모르는, 벡터 포맷을 약간 변경합니다.

사용법 #include <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <cstdio> 
#INCLUDE <cmath> 
#INCLUDE <벡터> 
#INCLUDE < 문자열 > 
#INCLUDE <CString을> 
#INCLUDE <지도> 
#INCLUDE < 세트 >
 사용  스페이스 성병;
형식 정의를 오래  오래 LL;
CONST  INT N = + 1E5 (10) ;
CONST  INT INF = 0x3f3f3f3f ;
INT 세인트 [N];
INT의 ED [N];
INT TR [N];
INT 힘 [N];
벡터 < INT > MA [N];
INT N;
INT IDX;
보이드 DFS ( INT U) {
    IDX ++ ;
    세인트 [U] = IDX;
    위한 ( INT 난 = 0 ; I <MA [U] 크기는 ()을, 난 ++ ) {
        DFS (MA [U] [I]);
    }
    ED [U] = IDX;
}
INT lowbit ( INT X) {
     복귀 , X - X;
}
보이드 추가 ( INT의 X, INT c) {
     int로 난을;
     (X = I, I <= N; I + = lowbit (I)) {
        TR [I] + = C;
    }
}
INT 합 ( INT X) {
     INT I;
    INT 입술 = 0 ;
     (X = I, I, I- = lowbit (I)) {
        아무것도 + = TR [I];
    }
    반환 입술을;
}
int로 주 () {
     지능 I;
    CIN >> N;
    대해 (ⅰ = 1 ; 나는 <N; I ++ ) {
         INT U, V는;
        scanf와 ( " % D % D ' , U, 및 V);
        MA [U] .push_back (V);
    }
    DFS ( 1 );
    대해 (ⅰ = 1 ; 나는 <= N; 나는 ++ ) {
        (세인트을 [I], 추가 1 );
        뷰 [I] = 1 ;
    }
    INT m;
    CIN >> m;
    반면 (M-- ) {
         문자 S [N];
        scanf와 ( " %들 " , S);
        경우 (S == * ' C ' ) {
             INT (X);
            scanf와 ( " %의 D ' , X);
            만약 VIS ([X]) {
                추가 (세인트 [X] - 1 );
                AM [X] = 0 ;
            }
            다른 {
                추가 (세인트 [X], 1 );
                AM [X] = 1 ;
            }
        }
        다른 {
             INT X;
            scanf와 ( " %의 D ' , X);
            의 printf ( " 가 % d \ n " , SUM (ED [X]) - 합 (세인트 [X] - 1 ));
        }
    }
}
코드보기

 

추천

출처www.cnblogs.com/ctyakwf/p/12324130.html