効果:平面$ $ 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)。 }