효과 : 평면 $ $ N의 지점에 설정 $의 S (L, R, a) $의 횡축은 모든 점 달러 나타내는 정의 [L, R] $ 종축 $ [A \ infty] 요청 수 내 $. 얼마나 많은 다른 컬렉션 가능합니다.
열거 오른쪽 아래 대부분의 지점에서 아래로 기부 펜윅 트리 통계.
사용법 #include <iostream> #INCLUDE <알고리즘> #INCLUDE <cstdio> #DEFINE REP (I, A, n)에 대한이 (INT 나 A =; 나는 = <N; ++ I) 네임 스페이스를 사용하여 표준; 타입 정의 오래 오래 LL; CONST INT의 N = 1E6 + 10 = INF 0x3f3f3f3f; INT의 N, C [N], 힘 [N], 2 [N]; 구조체 _ { INT의 X, Y; 불리언 연산자 <(CONST & _ 우) CONST { 경우 (Y = rhs.y!) 복귀 Y> rhs.y; X <rhs.x 리턴; } } A [N]; INT의 ID INT (X) { 복귀 LOWER_BOUND (B + 1, B + 1 + * B, X) -b; } INT QRY INT (X) { INT에서 R = 0; 대 (; X, X, X ^ = -x) (R) + C = [X]; R를 반환; } INT QRY INT (L, R의 INT) { 복귀 QRY (ID (R)) - QRY (ID (L-1)); } 부가 공극 (INT의 X) { X = ID (X); 만약 {(힘은 [X]!) 힘이 [X] = 1; 대 (; X <= * B, X, X + = -x) ++ C [X]; } } INT의 main () { 는 scanf ( "%의 D", N); REP (I, 1, N) { 는 scanf ( "%의 D % d에"& A [I] .x를, A [i]를 .Y); B [++ * B] = A [I] .x와; B [++ * B] = A [I] .x를-1; } [++ * B = 0, B B [++ * B = INF; 정렬 (B + 1, B + 1 + * B) * B = 고유 (B + 1, B + 1 + * b) -b-1; 정렬 (A + 1, A + N + 1); LL ANS = 0; REP (I, 1, N) { INT의 J = 1; (j <N && A [J + 1] == .Y A [I]를 .Y) 동안 J ++; REP (K, I, J) { INT의 QRY L = ((1), [K] .x를-1); R = INT QRY (a [K] .x를 + 1, K == J INF : A [K + 1] .x를-1); ANS + = (LL) (L + 1) * (R + 1); (a [K]를 추가한다. } 난을 J =; } 의 printf ( "% LLD \ 없음", ANS); }