題目
機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3...n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和。注意,同一批任務將在同一時刻完成。每個任務的費用是它的完成時刻乘以乙個費用係數fi。請確定乙個分組方案,使得總費用最小。
思路首先顯然是\(dp\)劃分狀態。
\[dp[i]=min(dp[j]+t[i]*(f[i]-f[j])+s*f[n]-s*f[j])
\]不難看出可以斜率優化。
然而不知道出題人怎麼想的,時間竟然可以出現負數,這樣對於\(x\)不單調的斜率優化,就只能用cdq分治維護凸包。
具體而言,就是和慣常的cdq分治一樣,分別將\([l,mid]\),\([mid+1,r]\)區間排序,\([l,mid]\)建乙個凸包,回答\([mid+1,r]\)的詢問。
乙個while打成if調了乙個晚上
**
#include#define m 300005
#define ll long long
using namespace std;
ll t[m],f[m],dp[m],s;
int n,qcnt,tcnt,top;
struct node
}q[m],stk[m],to[m];
bool cmp(node a,node b,node c)
ll calc(int cur,int i)
void cdq(int l,int r);
sort(q+1,q+qcnt+1);top=0;
for(int i=1;i<=qcnt;i++)
tcnt=0;
for(int i=mid+1;i<=r;i++)
to[++tcnt]=(node);
sort(to+1,to+tcnt+1);
int cur=1;
for(int i=1;i<=tcnt;i++)
cdq(mid+1,r);
}int main()
cdq(0,n);
printf("%lld\n",dp[n]);
return 0;
}
Bzoj 2726 SDOI 任務安排
memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...
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。在每批任務開始...