https://www.lydsy.com/JudgeOnline/problem.php?id=3295
アイデア:
最初:私たちは、挿入順序を削除するために変換することができますが最初の最後に挿入を削除し、それを逆にしようとすることです
第二:私たちは、各ポイントの寄与を考慮して、配列を削除します
xの現在のセット削除し、その後、要素を1 -xそれは大きなマイナスでなければならないより における(X + 1 )- N彼が減算されるべき未満で
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっ のconst int型 MAXN = 200005 ; INTのN、M、CNT。 int型; [MAXN]、POS [MAXN]、ツリー[MAXN] 【MAXN] ANS LL。 構造体ノード{ int型、T、X、ヴァル、タイプ、ID。 BOOLフレンド演算子 <(CONSTノードU、CONST ノードv){ 場合(UX == VX)を返す u.val < v.val。 返す UX < VX。 } }、Q [MAXN]、P [MAXN]。 int型 lowbit(INT X){ 戻り X&( - X)。 } ボイド追加(int型のx、int型のval){ 一方(X <= N){ ツリー[X] + = ヴァル。 X + = lowbit(X)。 } } int型 get_sum(INT X){ int型 RES = 0 。 一方、(X){ RES + = ツリー[X]。 X - = lowbit(X)。 } 戻りRESと、 } ボイド CDQ(int型 L、INT R){ 場合(L == R)のリターン; INT、M =(L + R)>> 1 。 以下のために(int型 Iを= Lを、iが<= R; iは++ ){ 場合(Q [i]が.T <= M)([I] .val、Q [i]は.TYPE q)を加えます。 他 ANS [Q [I] .ID] + = Q [I] .TYPE *(get_sum(N) - get_sum(Q [i]が.val))。 } のために(int型 I = 1と、iが<= R; iは++ ){ 場合(Q [i]が.T <= M)(Q [i]が.val、 -追加Q [I] .TYPE)を、 } のための(int型 I = Rを、I> = L; i-- ){ 場合(Q [i]が.T <=M)を追加(Q [i]は.val、Q [i]の.TYPE)。 他 ANS [Q [I] .ID] + = Q [i]は.TYPE * get_sum(Q [i]は.val- 1 )。 } のために(int型 I = 1と、iが<= R; iは++ ){ 場合(Q [i]が.T <= M)(Q [i]が.val、 -追加Q [I] .TYPE)を、 } INT Q1 = L。 INT Q2 = M + 1 。 用(int型私はLを=; I <= R; iが++ ){ 場合(Q [i]が.T <= M)P [Q1 ++] = Q [i]は、 他のp [Q2 ++] = Q [i]は、 } のために(int型 I = 1と、I <= R; iは++ ) Q [I] =P [i]は、 CDQ(L、M)。 CDQ(M + 1 、R)。 } int型のmain(){ scanf関数(" %D%dの"、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I])。 POS [I] = I。 Q [ ++ CNT] =ノード({CNT、I、[i]は、1、0 })。 } のために(int型 I = 1 ; I <= M; iは++ ){ int型のX; のscanf(" %のD "、&x)は、 Q [ ++ CNT] =ノード({CNT、POS [X]は、X、 - 1 、I})。 } ソート(Q + 1、Q + 1本の + CNT)。 CDQ(1 、CNT)。 以下のために(int型 I = 1 ; I <= M; iは++ ){ のprintf(" %LLDの\ nは"、ANS [I- 1 ])。 ANS [I] + = ANS [I- 1 ]。 } 戻り 0 。 }