ZOJ2112 동적 순위 (나무 커버 나무 : 나무의 펜윅 트리 세트 회장)

트리 유지 보수 간격 트리 (동적 개방 점) 유지 보수 범위의 내부 의장;

원래의 간격에 기반의 펜윅 트리 노드 I를 i 번째 버전 가중치 세그먼트 트리 [I - lowbit (I) + (1), I];

펜윅 나무를 합산하여 노드 (각 노드가 세그먼트 트리입니다), 당신은 나무의 대통령의 전체 버전을 얻을 수 있습니다;

때문에 배열의 나무의 특별한 특성, 역사적 버전을 저장하지 않아도, 최대 트리에서 직접 업데이트가 없습니다;

 

내 코드는 재귀 쓰기, 약간의 기억 상실이다

^ (* ¯ (OO) ¯) ^들 z0에없는 삶과 죽음, 없었 실수 나무는 질문은 정말 쓰라린 눈물이다의 의장 만하는 것을 슈퍼 메모리, 32M 메모리는 루오 구도 및 요령 루오 밸리 AC 코드를 재귀;

순환 엉망 가지 압력 압력 메모리를들 z0, 그래서도하고 코드의 일부를 붙여 넣습니다.

 

#INCLUDE <. 비트 / stdc ++ H>
 의 #pragma GCC의 최적화 (2)
 사용  스페이스 성병;
형식 정의를 오래  오래 LL을;
쌍 타입 정의 < INT , INT > PII;
쌍 타입 정의 < 이중 ,  > PDD;
CONST  INT N = 6E4 + 5 ;
CONST  INT M + 1E4 = 5 ;
CONST  INT INF = 0x3f3f3f3f ;
CONST  INT 개조 1E9 + = 7 ;
CONST   EPS 1e- = 9 ;
CONST   이중 PI는 ACOS을 = (- 1 . 0L );
#DEFINE LS (I << 1)
 #DEFINE의 RS (I << 1 | 1)
 #DEFINE의 인터넷 제
 #DEFINESE 제
 #DEFINE PB와 push_back
 #DEFINE MK make_pair
 #DEFINE MEM (a, b)가 memset (A, B를 sizeof (a))
) (읽기 LL
{
    LL X = 0 , t = 1 ;
    숯불 채널;
    반면 (! isdigit에 (CH = getchar가 ())) 의 경우 (CH2 == ' - ' ) t = - 1 ;
    반면 (isdigit에 (CH2)) X = { 10 * X + CH- ' 0 ' ; CH = getchar가 (); }
     리턴 X * t 단계;
}
구조체 노드 { INT L, R, V; C} [ 40 * N];
INT 루트 [N], T [N + 렌 M], A [N], L [M], R [M], K [M] (CMD) [M], TOT, N, m, CNT;
INT의 QX [N] QY [N], TX, TY;
보이드 업데이트 ( INT의 L, INT R, INT 지금 & INT POS, INT d)
{
    경우 (현재 == 0 ) = 현재 ++ CNT;
    C [현재] .V + = D;
    경우 (L == R) ;
    INT 중간 = L + R >> 1 ;
    경우 (POS <= MID) 업데이트 (좌, 중, C [현재] 펜닐, POS, d);
    다른 업데이트 (MID + 1 [지금, R, C .R, POS, d);
}
인라인 INT lowbit ( INT X)
{
    돌아가 , X (- X);
}
보이드 추가 ( INT의 X, INT의 Y)
{
     ( INT ; I <= N; I = I + X = lowbit (I)) 업데이트 ( 1 렌 루트 [I], A [X, Y);
}
INT 쿼리 ( INT L, INT R, INT의 K)
{
    경우 (L == R) 복귀 L;
    INT 중간 = L + R >> 1 ;
    INT 합 = 0 ;
    위한 ( INT 난 = 1 합 + =; I <= TY I ++) C [C [QY를 [I] 1-.] .V;
    위한 ( INT 난 = 1 sum- =; I <= TX I ++) C [C [QX를 [I] 1-.] .V;
    경우 (K <= 합)
    {
        위한 ( INT 난 = 1 QY [I] =; I <= TY I ++) C [QY [I]을 L.;
        위한 ( INT 난 = 1 QX [I] =; I <= TX I ++) C [QX [I]을 L.;
        반환 (L, 중간, K) 쿼리;
    }
    그밖에
    {
        위한 ( INT 난 = 1 QY [I] =; I <= TY I ++) C [QY [I] R한다.;
        위한 ( INT 난 = 1 QX [I] =; I <= TX I ++) C [QX [I] R한다.;
        반환 쿼리 (중간 + 1 , R, K- 합);
    }
}
int 형 ) (주
{
    INT T는 = 1 ;
    반면 (T-- )
    {
        위한 ( INT 난 = 1 루트 [I] = C [i]를 .L = C [i]를 .R = C [I] .V =; I <= I ++ CNT)가 0 ;
        CNT = TX = TY = 0 ;
        TOT = N =) (읽기, m = ) (판독;
        위한 ( INT 난 = 1 → [I] = A [I] =; I <= N을 I ++) ) (판독;
        위한 ( INT 난 = 1 ; I <= m; I ++ )
        {
             CH [ 2 ];
            INT X, Y, Z;
            scanf와 ( " % S " , CH);
            cmd를 [I] = CH [ 0 ];
            경우 (CH [ 0 ] == ' Q ' ) L [I] = (판독), R [I] = (판독), K [I] = () 판독;
            다른 L [I] = (판독) t [++ TOT] = R [I] = () 판독;
        }
        다행히도 (t + 1 , t + 모든 + 1 );
        LEN = 고유 (t + 1 , t + TOT + 1 -T-) 1 ;
        // 대해 (INT 내가 = 1; i가 <= LEN; I ++)의 printf ( "% D % C"를 t [i]는, I == LEN '\ n': ''); 
        위한 ( INT 난 = 1 ; I <= N; I ++)는 [I] = LOWER_BOUND (t + 1 , t + LEN + 1 , A [I]) - t 단계;
        위한 ( INT 난 = 1 ; I <= N; I ++) 추가 (I, 1 );
        위한 ( INT 난 = 1 ; I <= m; I ++ )
        {
            만약 CMD ([I] == ' Q ' )
            {
                TX = TY = 0 ;
                 ( INT J = L [I] - 1 , J, J = = lowbit (j)) QX [++ TX = 루트 [J]
                 ( INT J = R [i]를, J, J = = lowbit (j)) QY [++ TY = 루트 [J]
                의 printf ( " 가 % d \ n " , t [쿼리 ( 1 , 렌 K [I])]);
            }
            그밖에
            {
                (L을 [i]를 추가 - 1 );
                이 [L [I] = LOWER_BOUND (t + 1 , t + LEN + 1 , R [I]) - t;
                (L [i]를 추가, 1 );
            }
        }
    }
    반환  0 ;
}
재귀 버전 (로스 밸리)

 

 

추천

출처www.cnblogs.com/DeepJay/p/12404840.html