Bzoj 2726 SDOI 任務安排

2022-05-14 01:27:09 字數 1840 閱讀 8783

memory limit:131072kb

64bit io format:%lld & %llu

description

機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3...n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和。注意,同一批任務將在同一時刻完成。每個任務的費用是它的完成時刻乘以乙個費用係數fi。請確定乙個分組方案,使得總費用最小。

input

第一行兩個整數,n,s。

接下來n行每行兩個整數,ti,fi。

output

乙個整數,為所求的答案。

sample input

5 1

1 33 2

4 32 3

1 4

sample output

153

hint

source

sdoi2012

bzoj掛了,目前只過了樣例,沒有測試。

是 這道題的強化版本,資料範圍達到了1e6,同時t可能出現負值(強行時間倒流),這使得原本的公式不能保證斜率單調。

解決辦法是不彈隊頭,保留所有位置,每次二分查詢斜率最大位置。

——然而神tm我不管寫什麼演算法,加上二分就wa,這次只是加個二分,又調了20分鐘才過樣例。

1

/*by silvern

*/2 #include3 #include4 #include5 #include6 #include7 #include8

#define ll long long

9using

namespace

std;

10const

int mxn=1e6+1;11

long

long

read()

14while(ch>='

0' && ch<='9')

15return x*f;16}

17ll n;

18ll s;

19ll t[mxn],f[mxn];

20ll sumt[mxn],sumf[mxn];

21ll dp[mxn];

22int

q[mxn];

23 ll gup(int j,int

k)26 ll gdown(int j,int

k)29 ll gdp(int i,int

j)32

intmain()

40 memset(dp,0x3f,sizeof

dp);

41 dp[0]=0;42

int hd=0,tl=0

;43 q[hd]=0;44

for(i=1;i<=n;i++)

51 dp[i]=min(dp[i],gdp(i,q[l]));

52 printf("

i:%d %lld\n

",i,gup(i,q[l])/gdown(i,q[l]));

53while(hd1])<=gup(q[tl],q[tl-1])*gdown(i,q[tl]) )tl--;

54 q[++tl]=i;55}

56 printf("

%lld

",dp[n]);

57return0;

58 }

bzoj 2726 SDOI2012 任務安排

機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3 n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti 在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時...

BZOJ 2726 SDOI2012 任務安排

bzoj 2726 sdoi2012 任務安排 斜率優化 二分 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始...

bzoj 2726 SDOI2012 任務安排

機 器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的 若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是 各個任務...