[제목] 효과
$ N $ 블록 랜드가 상기 제 1 랜드 블록 $ $ $ I $ A_I 암소 적어도 $ $ F. 선택된 나라의 연속 조각되도록이 가축의 최대 수, 각 플롯의 평균.
[분석] 아이디어
이진 변환을 결정하는 단계, 즉 두 개의 평가 MID $ $의 평균 간격이 결정 "$ F $ 서브 세그먼트의 서브 세그먼트 및 음이 아닌 이상, 길이가 있는지 여부." 이 질문은 길이 제한이하는 특별한 장소를 가지고 있으며, 하위 세그먼트에 대한, 우리는 접두사를 해결할 수있는 첫 번째 생각이있을 수 있습니다 :
$$ 최대 \ {(조수 \ 제 j \ 0) sum_i 분의 \ {sum_j의 \} \} (N C의 \의 p <) $$
그러나 이러한 복잡성은 너무 큰, 그래서 우리는 단순화하는 방법을 고려해야합니다. $ $ I가 증가 할 때마다, 즉, 각 후보 세트 $의 분 \ {sum_j의 \} $에 새로운 값을 가질 것이다 $ 1 $ J 범위의 성장으로, 그것은 필요에 따라이 아닌 것으로 J $ $으로 열거주기만큼 최소 전류 레코드 변수, 각 시간은 $ $ 분의 새로운 값은 촬영.
[] 코드 구현
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #DEFINE RG 등록 4 #DEFINE의 (나, a가, b)에 대한 (RG의 INT 나 A =; 나는 = B를을 <; 내가 ++) 이동 (5)를 이용하여 스페이스 성병; 6 CONST의 INT의 N = 100,002 ; 7 번 A [N], S [N] 나 [N]; 8 INT의 N, F; 9 INT 의 main () { 10 는 scanf ( " %의 D % d에 " , N, F); 이중 maxn = 0 ; 11 이동 (I, 1 , N)는 scanf ( " %의 LF" , A [I]) maxn = 최대 (maxn하는 [I]) 12 번 리터가 S [N] / N, R = ( 더블 ) maxn; 13 동안 (RL> 1e- 5 ) { 14 배 중간 = (L + R) / 2 , (15) 로 이동 (I, 1 [I]는 [I] - 중간,들 = B, N) [I] =에서 S [I- 1 ] + B [I] 16 배 ANS = -N 미네소타 = N; 17 이동 (I, F, N) { 18 미네소타 = 분 (미네소타, S [I- F]), (19) = 최대 ANS (ANS, S [I] - 미네소타) 20 } (21) 의 경우 (ANS> =0 ) = L 미드; 다른 R = 중간; 22 } 23 COUT << INT (R * 1,000 ) << ENDL; 24 반환 0 ; 25 }