bzoj 2726 SDOI2012 任務安排

2021-08-13 23:45:17 字數 1216 閱讀 7230

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