【Baltic2004]配列

紙IOI2005代表チームのセット上の事例[神]の問題......

今233の論文を読んで、特定の証明

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
int型N、M。
長い 長いANS;
INTヴァル[ 1000005 ]、サイズ[ 1000005 ]、[ 1000005 ]、CNT、RT [ 1000005 ]、L [ 1000005 ]、R [ 1000005 ]。
INTツリー[ 1000005 ] [ 2 ]、FA [ 1000005 ]、DIS [ 1000005 ]。
INTのマージ(int型のx、int型Y){
     もし(x == 0 || Yの== 0 リターンX + Y。
    もし(ヴァル[X] < ヴァル[Y])
      スワップ(X、Y)
    ツリー[X] [ 0 ] =マージ(Y、ツリー[X] [ 0 ])。
    サイズ[X] =サイズ[ツリー[X] [ 0 ] +サイズ[ツリー[X] [ 1 ]] + 1 
    FA [ツリー[X] [ 0 ] =のX。
    もし(DIS [ツリー[X] [ 1 ] <DIS [ツリー[X] [ 0 ]])
    スワップ(ツリー[X] [ 1 ]、ツリー[X] [ 0 ])。
    DIS [X] = DIS [ツリー[X] [ 0 ] + 1 リターンのx; 
} 
int型メイン()
{ 
    scanf関数(" %のD "、&N)。
    以下のためにint型私= 1 ; iが<= N; iが++){scanf関数(" %のD "、および[I])。[1] - = I;}
     int型の CNT = 0 以下のためにint型 I = 1、N = iは<; iは++ ){ 
        valは[i]は = [I]。
        サイズ[I] = 1 
        ツリー[I] [ 0 ] =ツリー[I] [ 1 ] = DIS [I] = 0 ; 
        CNT ++ ;
        RT [CNT] = I。
        L [CNT] = R [CNT] = I。
        一方(CNT> 1 &&ヴァル[RT [CNT] <ヴァル[RT [CNT- 1 ]]){ 
            CNT - 
            RT [CNT] =マージ(RT [CNT]、RT [CNT + 1 ])。
            R [CNT] = R [CNT + 1 ]。
            一方、2 *サイズ[RT [CNT]]> R [CNT] -1- [CNT] + 2 
            RT [CNT] =(ツリー[RT [CNT] [マージ1 ]、ツリー[RT [CNT] [ 0 ])。
        } 
    } 
    のためのINTI = 1;私は= CNTを<; iは++ ){
         長い 長い qwq = ヴァル[RT [I]]。
        INT J = L [i]は、J <= R [i]は、J ++ 
            ANS + = 1LL * ABS(qwq- [J])。
    } 
    COUT << ANS。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/si--nian/p/10949946.html