機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3…n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti
。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和。注意,同一批任務將在同一時刻完成。每個任務的費用是它的完成時刻乘以乙個費用係數fi
。請確定乙個分組方案,使得總費用最小。
人生第一道斜率+cdq。
首先考慮怎麼n2
dp。
如果從前往後推,那麼時間有後效性,要n3
但是從後往前推就很好想了
大概就是這樣:
f[i]=min(f[i],f[j]+(st[i]-st[j]+s)*sf[i]);
其中st,sf為字尾和。
那麼假如st是單調的話,直接斜率優化就可以了。
然而因為出題人的奇怪時空觀,所以不是。
那麼就cdq搞就好了。
code:
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const ll inf=(1ll<<60);
ll n,s,f[300010],t[300010],sf[300010],st[300010];
ll f[300010];
ll q[300010],tmp[300010];
ll q[300010],st,ed;
ll read()
while(ch>='0'&&ch<='9')
return
x*f;
}void cdq(ll l,ll r)
for(ll i=mid;i>=l;i--)
cdq(l,mid);
ll i=l,j=mid+1,len=0;
while(i<=mid&&j<=r)
while(i<=mid) tmp[++len]=q[i++];
while(j<=r) tmp[++len]=q[j++];
for(i=1;i<=len;i++) q[l+i-1]=tmp[i];
}int main()
Bzoj 2726 SDOI 任務安排
memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...
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,而完成這批任務所需的時間是 各個任務...