問題の意味:$ $ N-長のシーケンスを考えるには満足し$ 1 \ルI <J \ルN $と$ a_iを+ a_j> b_i + b_j $ A $(i、j)を$ログを取得します。
私たちは、$を入れa_iを+ a_j> b_i + b_j $ $(a_iを-b_i)+(a_j-b_j)> 0 $に変形します。
注文$ C_I = a_iを-b_i \;(1個の\ルI \ルN)$は、その後、わずか$ C_I + c_j> 0 $が必要です。
$ N $それぞれ$ I $に$ 1 $のために、私たちは$ c_j>数-c_i $ $ J $のを満たすために発見した、と統計を使用することができ、アップ追加STLまたは半分は+ソートに解決しました。
以下のための$ので、私\ NEQ J $時間、$(i、j)の答えは考え出したので、$と$は、(jは、i)は、確かに満たされていない$。$ I <J $は、ちょうど半分それは$私を満たしていません< J $、および$ 2 $で割りました。
時間複雑$ O(nは\; \ログ\; N)$。
統計では、我々は、統計が$ jの$ $ J \ NEQ I $を満たしていなかったことがわかります。
現在の$ I $会う$ 2c_i> 0 $、すなわち$ C_I> 0 $ならば、彼は間違いなくカウントされるとしていました。
答えは$ C_I>番号$私は$ 0 $ 2 $で割った$を満たすために統計の値から減算されるので。
リファレンスコード:
#include <アルゴリズム> の#include <cstdioを> の#define INF 1E9 の#define EPS 1E-6 のtypedef 長い 長LL。 整数 nは、[ 200010 ]、B [ 200010 ]、K。 LL ANS; // 注意开長い長い int型のmain(){ scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++ ) のscanf(" %dの"、および[I])。 以下のための(int型= I 1、X; I <= N; I ++ ) scanfの(" %のD "、およびX)、A [I] - = X; // ここでa_iをC_I上記と同等である STD ::ソート(A + 1。、+ N-A + 1 ) のための(INT I = 1 ; I <= N; I ++ ){ K = STD :: UPPER_BOUND、(A + 1、+ N-A + 1、-a [I]) - A; / / 上記シーク位置-a_iの最初の数よりも大きい IF([I]> 0)ans--; // レイド決意a_iを> 0 ANS + =(LL)N - K +1 ; } のprintf(" %のLLD \ N- "、ANS >> 1); // 2で割った回答 戻り 0 ; }