【筆記篇】斜率優化dp(三) APIO特別行動隊
旁聽了一波給舒老師和學弟的pkuwc面試講座…
這裡有一段隱身的吐槽, 請反白觀看. 不想看的跳過這一段看似空白的東西就好了…
剛開始ATP學姐給我們講了自己面試的時候的事情..描繪了一下當時面試的場面和當時問的問題…ATP學姐太可愛了OvO可能準備的也不是很充足 用了好多的”然後” “就是”之類的, 自己也在吐槽, 老師後來也槽來著, 不過還是超可愛n(≧▽≦)n旁邊老師在記錄, 尤其記下了一個什麼”你認為學習資訊男生和女生有什麼區別?”的問題..可是這種問題怎麼可能問男生啊講道理, 然後學姐講完之後就是shallwe大爺來講, shallwe大爺還準備了稿子, 然後就講了一些面基技巧.. 但是也是比較老生常談的東西, 之前參加各種各樣的風采大賽回答問題的時候也就是那一套之類的 小時候還能做到, 現在反而越來越不行了.. 然後講了各種各樣的問題, 說是問的問題都在blog裡面.. 老師還說要blog的地址來給學弟學妹什麼的(那也就是包括我們咯), 但是聽完回來一看這blog裡的東西能給老師看?! 各種吐槽甚至還有吐槽面試培訓的.. 然後他們就回去學習了= =
老師就開始種講評, 還讓兩個人分別回答了上面說的男女區別問題 然後兩個都做出了比較”片面”的回答, 老師就說要往什麼三個方面想之類的說了一堆, 反正就是不懟人的同時優雅地裝逼的技巧,
===我===是===一===條===分===割===線===我===也===是===一===扇===傳===送===門===
繼續吐槽, 不過這次跟題目有關了.. 聽完回來就繼續寫這道題啊…
這道題顯然支援
那就是要優化, 就是要化式子嘛..然後剛開始以為這個題是
然後最大化
但是發現好像樣例差了好多好多…結果發現自己快讀沒讀負數…
然後改完之後輸出負數了… 手玩了一下發現好像這個
那就不能這麼化式子了, 就開始重新化.. 還是得從狀態轉移方程入手…
然後去括號
移項能得到
由於題目中已經給了
我們考慮中間的點在位於兩個斜率中間(大於大斜率小於小斜率顯然不優就不考慮了)的情況.
發現如果是位於下凸殼的點是不優的, 而位於上凸殼的點是優的, 我們就要維護一個上凸殼.
而這裡的斜率
如果一個斜率一旦已經小於(絕對值大)於隊首的邊, 那麼隊首的點在以後也不會優了 我們讓隊首出隊即可.
依然是維護一個單調佇列.
然後就沒有了. 程式碼: 1A了哈哈哈哈 (放肆地笑ing…)
#include <cstdio>
const int N=16+6;
typedef long long LL;
LL f[N],s[N]; int q[N],h,t,a,b,c,n;
inline int gn(int a=0,char c=0,int f=1){
for(;(c<48||c>57)&&c!='-';c=getchar());if(c=='-')f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) a=a*10+c-'0'; return a*f;
}
inline double slope(int x,int y){
return 1.0*(f[x]+a*s[x]*s[x]-b*s[x]-f[y]-a*s[y]*s[y]+b*s[y])/(s[x]-s[y]);
}
int main(){ n=gn(); a=gn(); b=gn(); c=gn();
for(int i=1;i<=n;++i) s[i]=s[i-1]+gn();
for(int i=1;i<=n;++i){
while(h<t&&slope(q[h],q[h+1])>=2*a*s[i]) ++h;
f[i]=f[q[h]]+a*(s[i]-s[q[h]])*(s[i]-s[q[h]])+b*(s[i]-s[q[h]])+c;
while(h<t&&slope(q[t],q[t-1])<=slope(q[t],i)) --t;
q[++t]=i;
} printf("%lld",f[n]);
}