有乙個數列,每個元素均有乙個完成耗時\(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 正難則反考慮維護不連通 什麼時候不連通,發現當左上角和右下角分在兩個塊裡面就涼了 當上和右邊或上和下邊聯通的時候左上角和右下角被分割在兩塊 另外兩種情況同理 於是並查集仿照乳酪維護...