トピックへのリンク: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 。 }