任務安排 SDOI2012

2022-05-03 17:06:08 字數 1173 閱讀 4142

有乙個數列,每個元素均有乙個完成耗時\(t_i\)與完成耗費\(f_i\),每個元素的耗費等於其完成時刻乘以完成耗費。可以將這些元素分為任意組,每一組的元素完成時刻一樣。每一組都會有乙個固定的額外時間耗費\(s\)。資料範圍\(3*10^5\)。

首先推出狀態轉移方程\(dp[i]=min(dp[j]+s*(sumf[n]-sumf[j])+sumt[i]*(sumf[i]-sumf[j]))\)

拆開可以得到斜率

\(\frac>s+sumt[i]\)

然而斜率不具有單調性,因此考慮\(cdq\)分治。

左側直接更新右側即可。

#include using namespace std;

namespace standardio

templateinline void write (t x)

}using namespace standardio;

namespace project

node (int _x,int _y) : x(_x),y(_y) {}

friend node operator + (const node &x,const node &y)

friend node operator - (const node &x,const node &y)

friend int operator * (const node &x,const node &y)

} w[n],queue[n],tmp[n];

inline bool cmpid (const node &x,const node &y)

void merge1 (int l,int r)

for (register int i=l; i<=r; ++i) w[i]=tmp[i];

} void merge2 (int l,int r)

for (register int i=l; i<=r; ++i) w[i]=tmp[i];

} void cdq (int l,int r)

for (register int i=mid+1; i<=r; ++i)

cdq(mid+1,r),merge2(l,r);

} inline void main ()

#undef int

}int main ()

SDOI2012 任務安排

這題首先要轉化一下這裡對於 s 的統計 我們先把 s 做字尾貢獻 然後就有了這個式子 f i min f j s1 i s1 j times s2 i s times s1 n s1 j 其中 s1 i sum c j s2 i sum t j 然後我們推式子 最後是個 x且 frac 右側是個單調...

SDOI2012 任務安排

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

SDOI2012 拯救小雲公主

題目最大的最小最小的最大 一看就非常的二分 考慮二分之後轉化成判定聯通問題 於是可以考慮乳酪 直接維護聯通好像很 gg 正難則反考慮維護不連通 什麼時候不連通,發現當左上角和右下角分在兩個塊裡面就涼了 當上和右邊或上和下邊聯通的時候左上角和右下角被分割在兩塊 另外兩種情況同理 於是並查集仿照乳酪維護...