Tokitsukazeと奇妙な長方形CodeForces - 1191F(フェンウィックツリー、カウント)

効果:平面$ $ Nのポイントに、集合$ Sを定義します(Lを、R、A)$の横軸はすべての点$ [L、R] $縦$缶要求内[\ inftyの] $を表します。どのように多くの異なるコレクション利用できます。

 

列挙下の一番右の点から、ダウン貢献フェンウィックツリー統計。

#include <iostreamの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
の#define REP(I、N)のための(iは= int型、iが<= N; I ++)
名前空間stdを使用。
typedefの長い長いLL。
CONST int型N = 1E6 + 10、INF = 0x3f3f3f3f。
int型N、C [N]、VIS [N]、B [N]。
構造体_ { 
	int型X、Y。
	ブール演算子<(CONST _&RHS)のconst { 
		IF(Y = rhs.y!)リターンY> rhs.y。
		X <rhs.x返します。
	} 
} [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、INT R){ 
	戻りQRY(ID(R)) - QRY(ID(L-1))。
}
ボイド追加(INT X){ 
	X = ID(X)
	(!VIS [X])であれば{ 
		VIS [X] = 1。
		用(; X <= * B; X + = X&-x)C ++ [X]。
	} 
} 
int型のmain(){ 
	scanf関数( "%のD"、&N); 
	REP(I、1、N){ 
		scanf関数( "%d個の%のD"、および[I] .X、&[I] .Y)。
		B [++ * B] = [I] .X。
		B [++ * B] = [I] .X-1。
	} 
	[++ * B] = 0、B B [++ * B] = INF。
	ソート(B + 1、B + 1 + * B)、* B =一意(B + 1、B + 1 + * B)-b-1。
	ソート(+ 1、A + 1個の+ N)。
	LL ANS = 0。
	REP(I、1、N){ 
		int型J =。
		(J <N && [J + 1] .Y == [i]は.Y)++ J一方、
		REP(K、I、J){ 
			int型L = QRY(1、[K] .X-1)。
			INT R = QRY([K]・X + 1、K == J INF:[K + 1] .X-1)。
			ANS + =(LL)(L + 1)×(R + 1)。
			([K]を追加します。
		} 
		iがjは=。
	} 
	のprintf( "%LLDする\ n"、ANS)。
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/11183907.html