BZOJ 2726 SDOI2012 任務安排

2022-04-30 01:15:15 字數 1334 閱讀 7482

bzoj_2726_[sdoi2012]任務安排_斜率優化+二分

機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3...n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和。注意,同一批任務將在同一時刻完成。每個任務的費用是它的完成時刻乘以乙個費用係數fi。請確定乙個分組方案,使得總費用最小。

第一行兩個整數,n,s。

接下來n行每行兩個整數,ti,fi。

乙個整數,為所求的答案。

5 11 3

3 24 3

2 31 4

153設f[i]表示前i個任務完成後最小的代價。

然後把後面的代價提前計算。

設sx,sy分別為x,y的字首和。

f[i]=f[j]+(m+sx[i]-sx[j])*(sy[n]-sy[j])。設sum=sy[n]。

然後斜率優化:f[i]=-sy[j]*sx[i]  -sx[j]*sum-m*sy[j]+sx[j]*sy[j]  +m*sum+sx[i]*sum

把決策點當成直線,斜率-sy[j]單調減。

於是維護乙個上凸殼。

但是每次查詢的x(i)=sx[i]不一定單調。

因此不能亂彈隊首。每次二分一下當前凸殼上交點離x(i)最近的大於x(i)位置,這個位置最優。

**:

#include #include #include using namespace std;

typedef long long ll;

#define n 300050

int n,m,xx[n],yy[n],q[n],l,r;

ll f[n],sx[n],sy[n],sum;

ll k(int j)

ll b(int j)

ll y(int i,int j)

bool cover(int p1,int p2,int p3)

bool check(int p1,int p2,int i)

int main()

sum=sy[n];

memset(f,0x3f,sizeof(f));

f[0]=0;

/*for(i=1;i<=n;i++)

j=q[ll];

//printf("%d\n",j);

f[i]=y(i,j)+m*sum+sx[i]*sum;

while(lq[r++]=i;

}printf("%lld\n",f[n]);

}

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 任務安排

機 器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的 若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是 各個任務...