Tokitsukaze와 이상한 사각형 CodeForces - 1191F (펜윅 나무, 계산)

효과 : 평면 $ $ 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); 
}

 

추천

출처www.cnblogs.com/uid001/p/11183907.html