正の整数の一定期間のシーケンスの場合、配列の逆は> AJ愛と私<jがペアを命じました。
これは、シーケンスの逆順に正の整数を必要としました。
入力
最初の行、数nは、シーケンス番号nがあります。N <= 5 * 10 ^ 5
秒行の数N、所与の配列。シーケンス内の各番号9 ^ 10個以下
の出力
数列逆の順序では、与えられました。
入力サンプル
6
5 4 3 1 2 6
サンプル出力
11
書式#include <cstdioを> に#define LL長い長い 名前空間stdを使用。 CONST INT N = 1E7 + 7。 整数nは、R。 LL ANS; 構造体A { int型のCNT、C [N]、LC [N]、RC [N]。 INT和(INTのP、INT L、INT R、int型のx、int型Y) { (pは!)が0を返す場合、 IF(L == X && R == y)は 戻りC [P]。 INT半ば= L + R >> 1。 もし(Y <= MID)戻り和(LC [P]、L、中、X、Y) IF(X> MID)戻り和(RC [P]、ミッド+ 1、R、X、Y)。 戻り和(LC [P]、L、中、X、MID)+ SUM(RC [P]、ミッド+ 1、R、中間+ 1、Y); } ボイド追加(INT&P、int型のL、int型のR、int型のx、int型K) { (P!)であれば 、P = ++ CNT。 IF(L == R) { C [P] + = K。 リターン; } INT半ば= L + R >> 1。 IF(X <= MID) を追加(LC [P]、L、中、X、K)。 他の アドオン(RC [P]、ミッド+ 1、R、X、K)。 C [P] = C [LC [P]] + C [RC [P]]。 } }木。 メイン()がINT { scanf関数( "%d個"、&n)を。 以下のために(INT I 1 =; I <= N; I ++) { int型のX; scanf関数( "%のD"、&x)は、 ANS + = tree.sum(R、1,1e9、X + 1,1e9)。 tree.add(R、1,1e9、X、1)。 } のprintf( "%のLLD"、ANS)。 0を返します。 }