文字列の数を考えると、中央部分を削除するように求められ、残りはどのくらいの平均最小です。
それは半分を考えるのは簡単ではありません。
$ソリューション:$
少し式をプレイするハンド:
第容易プレフィックスに発生し、接頭辞は1に$ I $ sum_i表し、そう簡単にはO(1)クエリ間隔及び/微分することができます
最小平均としてバイナリミッド。
仮定R&LT省略間隔〜L(LRが削除されます)
平均に等しいです。
$のAVE = {sum_ {I-1} + sum_ {ニュージャージー}} / {N-(J-I + 1)} $
だから、ここ単調があります:
当量のAVEの$ \ $中旬
少し顔を変形し、取得
$ sum_n-sum_j + sum_ {I-1} \当量の中間* N-MID * jを+中間*(I-1)$
その
$(sum_n-MID * n)で\ GEQ(sum_j-MID * J) - (sum_ {I-1} -mid *(I-1)$
令$ sum_i-I *半ば$ = $ C_I $
私たちは、決定する必要があります
$ C_N \ GEQ C_j - C_ {I-1} $
あなたはバイナリ境界を決定することができます。
複雑$ O(n)と$
下側の境界にはほとんど関心が、アウトにできるようになります。
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
const int型 MAXN = 1E5 + 233 。
ダブル合計[MAXN]。
int型のn;
二重C [MAXN]。
ダブルMAXX [MAXN]。
ダブルミネソタ州[MAXN]。
ブールチェック(ダブルX)
{
ため(int型 i = 0 ; iが<= N; iは++ )
{
C [I] =和[I] -i * X。
}
ミネソタ州[ 1 ] = Cを[ 1 ]。
以下のための(int型 I = 2; iが<= N; iは++ )
{
ミネソタ[I] =分(C [i]は、ミネソタ州[I- 1 ])。
}
[N MAXX - 1 ] = C [N- 1 ]。
以下のために(int型、I = N- 2、I> = 1 ; i-- )
{
MAXX [I] = MAX(C [i]は、MAXX [I + 1 ])。
}
のための(int型 I = 2 ; iが<N; iが++ )
{
場合(MAXX [I] -minn [I- 1 ]> C [N])
リターン 1 。
}
リターン 0 ;
}
int型のmain()
{
scanf関数(" %のD "、&N)
以下のために(int型 i = 1 ; iが++; iが<= N )
{
二重Xと、
scanf関数(" %のLF "、&x)は、
和[I] =和[I- 1 ] + X。
}
ダブル L = 0、R = 1E4 + 233 。
一方、((RL)> 0.000000001 )
{
ダブルミッド=(L + R)/ 2 。
もし(チェック(MID)== 0 )
L = ミッド。
他の
R = ミッド;
}
のprintf(" %の.3lf " 、L)。
リターン 0 ;
}
(終わり)