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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4655


題目大意

nnn座橋,刪除第iii座會產生wiw_iwi?的代價,相鄰的兩座橋i,ji,ji,j會產生(hi?hj)2(h_i-h_j)^2(hi??hj?)2的代價,要求代價最小。


解題思路

fif_ifi?表示留到第iii座橋的答案,si=∑j=1iwis_i=\sum_{j=1}^iw_isi?=j=1i?wi?,那么有fi=fj+si?1?sj+(hi?hj)2f_i=f_j+s_{i-1}-s_j+(h_i-h_j)^2fi?=fj?+si?1??sj?+(hi??hj?)2
fi=si?1+hi2+fj?sj+hj2?2hihjf_i=s_{i-1}+h_i^2+f_j-s_j+h_j^2-2h_ih_jfi?=si?1?+hi2?+fj??sj?+hj2??2hi?hj?
其實就是要求最小化fj?sj+hj2?2hihjf_j-s_j+h_j^2-2h_ih_jfj??sj?+hj2??2hi?hj?
Si=fi?si+hi2S_i=f_i-s_i+h_i^2Si?=fi??si?+hi2?
那么就有fi?si?1?hi2=Sj?2hihjf_i-s_{i-1}-h_i^2=S_j-2h_ih_jfi??si?1??hi2?=Sj??2hi?hj?

然后上CDQCDQCDQ斜率優化就好了,大體是左邊排序后處理出左邊的凸殼然后考慮它對右邊的貢獻即可,注意對于hjh_jhj?相等的我們取SjS_jSj?小的點。

時間復雜度O(nlog?2n)O(n\log^2 n)O(nlog2n)(同理用歸并排序可以做到O(nlog?n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll n,p[N],s[N],f[N],S[N],h[N],st[N],q[N]; bool cmp(ll a,ll b){return h[a]>h[b];} bool cMp(ll a,ll b){return (h[a]==h[b])?(S[a]<S[b]):(h[a]<h[b]);} double slope(ll a,ll b) {return (double)(S[a]-S[b])/(h[a]-h[b]);} void cdq(ll l,ll r){if(l==r){S[l]=f[l]-s[l]+h[l]*h[l];return;}ll mid=(l+r)>>1,cnt1=l-1,cnt2=mid;for(ll i=l;i<=r;i++)if(p[i]<=mid)q[++cnt1]=p[i];else q[++cnt2]=p[i];for(ll i=l;i<=r;i++)p[i]=q[i];cdq(l,mid);ll tot=0;for(ll i=l;i<=mid;i++){if(h[p[i]]==h[p[i-1]]&&i!=l)continue;while(tot>1&&slope(st[tot-1],st[tot])>slope(st[tot-1],p[i]))tot--;st[++tot]=p[i];}for(ll i=mid+1;i<=r;i++){while(tot>1&&slope(st[tot-1],st[tot])>2*h[p[i]])tot--;f[p[i]]=min(f[p[i]],s[p[i]-1]+h[p[i]]*h[p[i]]+S[st[tot]]-2*h[p[i]]*h[st[tot]]);}cdq(mid+1,r);sort(p+l,p+r+1,cMp);return; } int main() {memset(f,0x3f,sizeof(f));scanf("%lld",&n);f[1]=0;for(ll i=1;i<=n;i++)scanf("%lld",&h[i]),p[i]=i;for(ll i=1;i<=n;i++)scanf("%lld",&s[i]),s[i]+=s[i-1];sort(p+1,p+1+n,cmp);cdq(1,n); printf("%lld",f[n]);return 0; }

總結

以上是生活随笔為你收集整理的P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】的全部內容,希望文章能夠幫你解決所遇到的問題。

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