标签:Building P4655 min 题解 复杂度 mathcal 代价 dp
P4655
分析
发现如果在 \(i,j\) 之间建桥,那么 \((i,j)\) 内的所有柱子都是无用的,代价还需加上 \((i,j)\) 内的所有拆除代价。设 \(dp_i\) 为从 \(1\) 走到 \(i\) 的最小代价,于是转移方程就呼之欲出了:
\[dp_i=\min\limits_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+s_{i-1}-s_j\} \],其中 \(s_i\) 表示拆除代价的前缀和。发现如果枚举每一个 \(j\) 时间复杂度是 \(\mathcal{O}(n^2)\),显然会 TLE,因此考虑优化。发现这个式子是很典型的斜率优化形式,可以变形为:
\[dp_i=\min\limits_{j=1}^{i-1}\{dp_j-2h_ih_j+h_j^2-s_j\}+h_i^2+s_{i-1} \]然而发现每次查询的斜率并不是有序的,因此不能直接单调队列维护凸包。发现数据范围只到 \(10^5\),用李超线段树可以方便的求出当 \(x=h_i\) 时最小的 \(y\),于是就可以做了。时间复杂度 \(\mathcal{O}(n\log^2n)\)。
核心代码
qread(n);int i,j,mx=0;for(i=1;i<=n;i++) qread(h[i]),mx=qmax(mx,h[i]);
build(1,0,mx);for(i=1;i<=n;i++) qread(w[i]),w[i]+=w[i-1];
dp[1]=0;upd(1,0,mx,Line{-2*h[1],h[1]*h[1]-w[1]});
for(i=2;i<=n;i++){
dp[i]=que(1,0,mx,h[i])+h[i]*h[i]+w[i-1];
upd(1,0,mx,Line{-2*h[i],dp[i]+h[i]*h[i]-w[i]});
}printf("%lld\n",dp[n]);
标签:Building,P4655,min,题解,复杂度,mathcal,代价,dp 来源: https://www.cnblogs.com/lxy-2022/p/P4655-Solution.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。