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