BZOJ2726 SDOI2012 任務安排

2022-09-11 00:39:39 字數 1170 閱讀 8474

題目

機器上有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。在每批任務開始...