逆のツリーラインのダイナミックなオープンポイント

正の整数の一定期間のシーケンスの場合、配列の逆は> 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を返します。
}

  

おすすめ

転載: www.cnblogs.com/cutemush/p/11833958.html