[제목] 효과
문제의 의미 미션 1 일정 데이터의 범위는 1 $ \ 르 N의 \의 LE3의 *하게 10 ^ 5,1 \ 르 S, T_i, C_I \ le512 $
[분석] 아이디어
우리는 사소한 최적화 솔루션 1 개 작업을 준비
$ 명세서가 설정 SC $으로 $ T이다 접두사 C $으로 배열 및 전송 방정식 F에 $로 변환된다 [I] = 분 \ {F [J] - (세인트 [I] + S) * SC [J] \ } (0 \ 르 J <I) + 세인트 [I]는 * SC [내가] + S *에서의 SC [N] $
우리는 최소 $ $ 함수를 제거 후 약 J $ $ F 변수로 간주 [J], SC [J] $, 나머지 부분이 고려 $ 상수 $의 F [J] = (세인트 [I] + S의 값 ) * SC [J] + F [i]를 -ST [내가 * SC [I] -S * SC [N] $
그럼 $ SC은 [J] $ 횡축, $ 수직축 확립 [J] $ 평면 직사각형 좌표계 F를 다음이 $ 명세서의 경사 절단의 [내가] + S $를 $ y는 $ 축이며 [I] -ST [내가 * SC [I] -S * SC [N] $ 스트레이트 F $의 거리. 등가 좌표계 후보 세트 포인트의 집합이고, 각 결정 $ $으로의 J는 시스템 점 $ (SC [J], F [J])에 대응 좌표 $. 라인의 기울기는 [I] f를 작게 $ $ 후, 작은 절편을 고정된다.
즉시 쓸모 결정을 제거하기 위해, 우리는 "인접 경사 연결 두 선분이 일정하게 증가하는"및 유지 "볼록 선체 아래." 직선의 $의 유전율 $ 슬로프를 들어, 직선의 기울기 때 좌측 정점 $ <K $으로 오른쪽 세그먼트 $의 기울기> K $으로, 그 정점은 최적의 결정이다.
구체적으로, 우리는 큐 모노톤 볼록 선체를 유지하기 위해 사용할 수있다. $ Q $ 단조로운 정점의 볼록 선체에 대응하는 의사 결정 변수의 다수의 큐를 유지하고, 횡축 증가를 만족 인접하는 2 점을 연결하는 선분의 기울기는 일정하게 증가된다.
다음과 같이 각 상태 변수 $ i 서 $, 우리는 계속 :
{- F [Q [1] F [Q [L + 1]} {$ q를 [1], Q [L + 1] $, 만약 $ \ FRAC의 기울기의 두 개의 결정 변수 $ 1 $ HOL 검사 SC [Q [L + 1] - SC [Q [1]} \ 르 세인트 S + [I] $ 넣어 $ q를 [L] $ 헤드 소자까지 반복 동작까지 만족하지 대기열
이 경우 $ $의 HOL $으로의 Q 2.은 [1,5]가 $ 최적의 결정, 계산 된 F $ 인 [I] $
3. 테일 $을 $ 소자 $ q를 [R-1], Q [R] $ $ I $을 만족 단조롭게 증가하는 기울기 만족하지 후 $ Q [R] $ 꼬리 요소까지 반복 대기열을 확인 일정하게 증가하는 기울기를 충족, 나는이 $ $ 꼬리에 삽입
알고리즘의 시간 복잡도는 $의 O (N) 인 $
[] 코드 구현
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #INCLUDE <CString을> 4 #INCLUDE <알고리즘> 5 #INCLUDE <cmath> 6 #INCLUDE <큐> 7 #DEFINE의 g () getchar가 () 8 #DEFINE의 RG 레지스터 9 #DEFINE의 이동 (I는은 b)에 대한 (RG의 INT 난 =; 나는 <= B를 단계; 내가 ++) 10 #DEFINE 백 (I, a가, b) (RG의 인터넷 용 난 =; I> = B; 난 -) 11 #DEFINE의 DB 이중 12 #DEFINE이 줄게 긴 길이 13 #DEFINE IL 인라인 14 #DEFINE PF printf의 15 #DEFINEMEM (a, b)가 memset (A, B를 sizeof (a)) (16) 를 사용 스페이스 성병; 17 INT의 FR () { 18 INT w = 0 , Q = 1 ; 19 숯 CH = g (); 20 동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 21 일 경우 (CH2 == ' - ' ) Q = - 1 ; 22 CH = g (); 23 } 24 동안 (CH2> = ' 0 ' && CH <=' 9 ' ) << w (w = 1 ) + (w << 3 ) + CH- ' 0 ' , CH = g (); 25 창 * w의 Q; 26 } 27 CONST의 INT N = 3e5 + (2) ; 28 INT의 N, S, Q [N], L = 1 , R = 1 ; 29 LL의 F [N], 세인트 [N], SC [N], 등 ; 30 INT 의 main () { 31 // freopen을 ( "", "R", 표준 입력); 32 // freopen을 ( "", ""w, 표준 출력); 33 N의 FR = ()의 S = FR (); 이동 (I, 1 , n)의 일 [I] = 세인트 [I- 1 ] + FR (), SC [I]가 SC = [I- 1 ] + FR (); 35 MEM (F, 0x3F입니다 ) [F 0 ] = 0 ; (36) Q는 [ 1 ] = 0 ; 등 가 S * (SC) [N]; 37 이동 (I, 1 , N) { 38 RG LL의 유전율 = S + 세인트 [I]; 39 동안 (L <R && F [+ Q [1 1 ] - F [Q [1] <= k 값 * (SC [Q [L + 1 ] - SC [Q [L]])) (L) ++ ; 40 F [I]가 F = [Q [1] - * k는 SC [Q [1] + 세인트 [I] * SC [I] + 등 ; (41) 반면 (L <R && (F [Q [R] - F [Q [R- 1 ]) * (SC [I] -sc [Q [R])> = (F [i]를 -f [Q [R]) * (SC [Q [R] - SC [Q [R- 1 ])) r-- 사용 ; (42) Q [++ R = I; 43 } 44 PF ( " % LLD \ 없음 ' , F [N]); 45 반환 0 ; 46 }