[BZOJ3295] [Cqoi2011動的逆順(CDQパーティション)

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]は、10 })。
    } 
    のために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 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/MengX/p/11503124.html