日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学习笔记】斜率优化

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】斜率优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【學習筆記】斜率優化

[SDOI2012]任務安排

斜率優化入門題:

\(f(x)\)\(F(x)\)綴和,\(t(x)\)\(T(x)\)的前綴和。\(dp(i)\)表示完成到第\(i\)任務的最小代價,轉移:

\(dp(i)=\min \{dp(j) +f(j+1)\times(S+t(i)-t(j)) \}\)

拆掉:

  • \(j\)無關: 沒有
  • 只和\(j\)相關:\(dp(j)+f(j+1)\times(S-t(j))\)
  • \(i,j\)相關:\(f(j+1)\times t(i)\)

我們發現只和\(j\)相關的可以直接預處理,現在的問題是確定了\(i\)如何快速找到一個\(j\)

\(y_j=dp(j)+f(j+1)\times(S-t(j))\)\(x_j=f(j+1)\),原式可以寫成:
\[ dp(i)= y_j+x_jt(i) \]

轉換一下式子
\[ y_j=-t(i)x_j+dp(i) \]

現在問題就變成了確定了一個\(i\),要快速查詢前面的一個\(j\)使得\(dp(i)\)最小

把這個東西看成一條直線,就變成了我有一條在平面上平移的斜率為\(-t(i)\)的直線,現在要找一個點\((x_j,y_j)\)使得過這個點的斜率為\(-t(i)\)的直線的截距盡量小。

藍線:斜率為\(-t(i)\)的線

紫點:\((x_j,y_j)\)

很明顯,可以看做有一條在\(y\)負半軸無限遠處有一條直線慢慢上移(截距慢慢變大),這條直線突然經過一個我們集合內的點時,它此時的截距就是最小的截距。很顯然,這個點一定在凸包上面,而且這個點左右兩邊的斜率一定是左邊更小,右邊更大(斜率是負數)。

動態維護一下凸包就好了。

//@winlere #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>using namespace std; typedef long long ll; inline int qr(){register int ret=0,f=0;register char c=getchar();while(c<48||c>57)f|=c==45,c=getchar();while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();return f?-ret:ret; } int n,s; const int maxn=3e5+5; int Ti[maxn],Fi[maxn]; ll st[maxn],sf[maxn]; ll x[maxn],y[maxn],q[maxn],dp[maxn]; int cnt;inline ll getval(const int&i,const int&j){return dp[j]+sf[j+1]*(s+st[i]-st[j]); }inline bool chek0(const int&i,const int&j,const ll&k){return (long double)1.0*((y[i]+dp[i])-(y[j]+dp[j]))*(x[i]-x[k])<=(long double)1.0*((y[i]+dp[i])-(y[k]+dp[k]))*(x[i]-x[j]); }inline bool chek(const int&i,const int&j,const ll&k){return (long double)1.0*(y[i]+dp[i])-(y[j]+dp[j])<=(long double)1.0*k*(x[i]-x[j]); }inline int lookup(const ll&k){register int l=1,r=cnt-1,ret=cnt,mid;while(l<=r){mid=(l+r)>>1;if(chek(q[mid],q[mid+1],k))r=mid-1,ret=mid;else l=mid+1;}return q[ret]; } int main(){n=qr();s=qr();for(register int t=1;t<=n;++t)Ti[t]=qr(),Fi[t]=qr(),st[t]=st[t-1]+Ti[t];for(register int t=n;t>=0;--t) sf[t]=sf[t+1]+Fi[t];for(register int t=0;t<=n;++t) y[t]=sf[t+1]*(s-st[t]),x[t]=sf[t+1];q[cnt=1]=0;for(register int t=1;t<=n;++t){dp[t]=getval(t,lookup(-st[t]));while(cnt>1&&chek0(q[cnt-1],q[cnt],t)) --cnt;q[++cnt]=t;}cout<<dp[n]<<endl;return 0; }

D - Cats Transport

\(O(n^2)\)的轉移:
\[ dp(i,j)=\min\{dp(i-1,j),dp(i-1,k)+(j-k)\times t_j-(sum(j)-sum(k))\} \\ sum(i)=\Sigma_{j=1}^it_j-dis(1,j) \]
拆開\(j,k\)直接變成一個斜率優化的套路式。

\(x_k=k,y_k=dp(i-1,k)+sum(k)\)

原式變為:
\[ y_k=t_jx_k+(dp(j)-j\times dis(1,j)+sum(j)) \]
查詢一個截距最小值。好像要單調隊列維護。查到哪個\(k\)轉移套到原式就好了。

不過這里復雜度貌似\(O(n)(k\le 100)\)

//@winlere #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue>using namespace std; typedef long long ll; inline ll qr(){register ll ret=0,f=0;register char c=getchar();while(c<48||c>57)f|=c==45,c=getchar();while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();return f?-ret:ret; } const int maxn=1e5+5; int n,m,p; int dis[maxn]; ll sumd[maxn]; ll sumdata[maxn]; ll x[maxn]; ll y[maxn]; ll dp[101][maxn]; struct NODE{int pos,time;ll limit;NODE(){limit=pos=time=0;}inline bool operator <(const NODE&a)const{return limit<a.limit;}inline void scan(){pos=qr();time=qr();limit=time-sumd[pos];} }data[maxn];typedef deque<int>::iterator it; deque < int > q;int main(){n=qr();m=qr();p=qr();for(register int t=2;t<=n;++t)sumd[t]=(dis[t]=qr())+sumd[t-1];for(register int t=1;t<=m;++t)data[t].scan();sort(data+1,data+m+1);for(register int t=1;t<=m;++t) sumdata[t]=data[t].limit+sumdata[t-1];memset(dp,5,sizeof dp);dp[0][0]=0;it ita;for(register int i=0;i<=m;++i)x[i]=i;for(register int t=1;t<=p;++t){for(register int i=0;i<=m;++i){dp[t][i]=dp[t-1][i];y[i]=dp[t-1][i]+sumdata[i];}q.clear();for(register int i=1;i<=m;++i){q.push_back(i-1);ita=q.begin();while(q.size()>1&&y[*(ita+1)]-y[*ita]<=1ll*data[i].limit*((*(ita+1))-(*ita))) q.pop_front(),ita=q.begin();register int j=q.front();dp[t][i]=min(dp[t][i],dp[t-1][j]+1ll*(i-j)*data[i].limit-(sumdata[i]-sumdata[j]));ita=q.end()-1;while(q.size()>1&&(y[*ita]-1ll*y[*(ita-1)])*(i-(*ita))>=1ll*(y[i]-y[*ita])*((*ita)-(*(ita-1)))) q.pop_back(),ita=q.end()-1;;}}cout<<dp[p][m]<<endl;return 0;}

參考文獻:

瓦努霍格木茨格蘭芬多神威無敵無雙超神大聚聚yyb的博客

轉載于:https://www.cnblogs.com/winlere/p/10992557.html

總結

以上是生活随笔為你收集整理的【学习笔记】斜率优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97久久免费视频 | 免费在线观看成人av | 久久伊人精品视频 | 九九热视频这里只有精品 | 天堂在线中文8 | 欧美黄页在线观看 | 91视频综合网| 99久精品| 人成午夜| 亚洲精品1区2区3区 国产丝袜网站 | 黑人精品无码一区二区三区AV | 视频在线观看免费大片 | 性高湖久久久久久久久免费 | 制服丝袜在线看 | 国产三级在线看 | 国产精品极品白嫩在线 | 国产污视频在线看 | 精品999www| 天堂视频网 | 亚洲午夜在线观看 | 97人妻精品一区二区三区免费 | 欧美日韩一区二区在线 | 天天色天天射综合网 | 奇米狠狠干 | 亚洲综合一二三区 | 波多野结衣一二三区 | 欧洲成人午夜精品无码区久久 | 青青草原综合久久大伊人精品 | 一区二区精品视频 | 亚洲欧美一区二区三区不卡 | 伊人成长网| 毛片视频免费播放 | 久久色在线观看 | 总裁憋尿呻吟双腿大开憋尿 | 国产 日韩 欧美 制服丝袜 | 视色网| 日韩精品卡通动漫网站 | 天堂久久久久 | 欧美系列在线观看 | porn国产| 国产一级二级三级在线 | 女人扒开腿让男人捅爽 | 久久久激情网 | 久久中文av| h网站在线 | 都市激情久久 | 可以免费看av的网址 | 性色av一区二区三区免费 | 亚洲中文字幕无码不卡电影 | 国产日韩欧美成人 | 中文资源在线播放 | 高清中文字幕在线a片 | 日韩影视一区二区三区 | h部分肌肉警猛淫文 | 91久久精品国产91久久性色tv | a视频免费在线观看 | 国产精九九网站漫画 | 麻豆免费下载 | 看片一区| 超碰在线成人 | 青青草视频免费看 | 国产精品无码久久久久久电影 | 欧洲午夜视频 | 青青青国产在线 | av片大全 | 射射av| 亚洲无码乱码精品国产 | 亚洲在线中文字幕 | 午夜做爰xxxⅹ性高湖视频美国 | 国产高清www | 亚洲区精品 | 日韩中文字幕亚洲 | 爱情岛亚洲品质自拍极速福利网站 | 欧美巨大另类极品videosbest | 影音先锋三级 | 免费操人视频 | 国产一区二区三区四区精 | 在线观看国产91 | 97人妻天天摸天天爽天天 | 中文字幕网址在线 | 涩涩视频免费在线观看 | 国产精品国产精品国产专区蜜臀ah | 久草影视网 | 女生鸡鸡软件 | 中国美女一级片 | 免费视频色 | 亚洲女女做受ⅹxx高潮 | 一区二区三区不卡视频在线观看 | 国久久| 99久久99久久免费精品蜜臀 | 日韩欧美国产精品综合嫩v 国产小毛片 | 天天天天天天天干 | 欧美五月婷婷 | аⅴ资源天堂资源库在线 | 好色婷婷| 国产乱色| 好吊视频一区二区三区 | 日本特黄特黄刺激大片 | 制服丝袜av一区二区三区下载 |