문제 보고서에 CH301 작업 스케줄링 솔루션 2

주제 포털

[제목] 효과

문제의 의미 미션 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 }
코드는 여기 찌를

추천

출처www.cnblogs.com/THWZF/p/11716740.html