hdu3015フェンウィックツリー

トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=3015

問題の意味:指定されたグループ数n、各xの数及び値は、数Nヴァル基の和を求めるための2つによりH、両者の値を有します。すべてのxおよびHのすべてが(重くない)離散あるX '及びH'となり、ヴァル(I、Jは ) ABS(xは' I -X- ' J)*分(時間、私は'時間J ') 。

以下のような:

  X、H - > X 'H'

10,100 - > 1,1

50500 - > 4,4

20,200 - > 3,3

20,100 - > 1,1

考える:n個の*のLOGNの最適化へのn * nは生きることができる限り。

TIP1:Hに従って「ソート値、および動的に各点が追加された場合、追加点Hに追加された」最小の場合、値min()は 'Hに解釈されるべきです

tip2:離散しかし重くない、独特の必要はありません。

tip3:ABS()セクション、2つのフェンウィックツリー、統計の数、統計的な合計の取り扱いに関する。ABS()値は(Xの数よりも大きい* X「Xのsum-より大きい」「)+(xよりも少ない」* X'-X「の合計数よりも少ないです)

tip4:RES和フェンウィックツリーは、長い長い開くように要求されています

コードを接続します。

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include < 文字列の.h> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
const  int型 MAXN = 1E5 + 10 INT C1 [MAXN]、C2 [MAXN]、N。
INT lowbit(INT X)
{ 
    戻り X& - X。
} 
ボイド ADD1(int型のx、int型のC)
{ 
    ため(; X <= Nであり、X + = lowbit(X))
        C1 [X] + = C。
} 
ボイド ADD2(int型のx、int型のC)
{ 
    ため(; X <= Nであり、X + = lowbit(X))
        C2 [X] + = C。
} 
INT Query1を(INT X)
{ 
    int型 RES = 0 (; X; X- = lowbit(X))
        RES + = C1 [X]。
    リターンのres; 
}。
長い 長い QUERY2(INT X)
{ 
    長い のRES = 0 (; X; X- = lowbit(X))
        RES + = C2 [X]。
    リターンのres; 
}
構造体ノード
{ 
    int型のx、H。
} P [MAXN]。
BOOL CMP(ノードA、ノードB)
{ 
    場合(AH == BH)戻り AX> BX。
    他に 戻る >ああBH。
} 

int型のmain()
{ 
    一方(のscanf(" %dの"!、&N)= EOF)
    { 
        memsetの(C1、0はsizeofのC1)。
        memsetの(C2、0はsizeofのC2)。
        INT X [MAXN] = { 0 }、H [MAXN] = { 0}。
        以下のためにint型、I = 0のscanf(; iがn <Iが++)" %d個の%のD "、&​​P [i]は.X、&P [i]は.H)、X [I] = P [i]を.X、時間[I] = P [I]・H。
        ソート(X、X + N)。
        ソート(H、H + N)。
        ソート(P、P + N、CMP)。
        長い 長いのres = 0 ;
        以下のためにint型 i = 0 ; iがn <; iは++ 
        { 
            int型 tmpx = LOWER_BOUND(X、X + N、P [i]は.X)-x + 1 INT TMPH = LOWER_BOUND(H、H + N、P [I]・H)-h + 1;
            // coutの<< tmpx <<」「<< TMPH <<てendl; 
            RES + = 1LL * TMPH *( - 1LL * tmpx *(Query1を(N)-query1(tmpx))+ 1LL * tmpx * Query1を(tmpx- 1)+ QUERY2(N)-query2(tmpx)-query2(tmpx- 1 )); 
            ADD1(tmpx、1 )。
            ADD2(tmpx、tmpx)。
        } 
        のprintf(" %LLDする\ n " 、RES)。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/myrtle/p/11756459.html