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 11 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,而完成這批任務所需的時間是 各個任務...