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分治】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac电脑如何使用ping命令如何pin
- 下一篇: P3466-[POI2008]KLO-B