JZOJ 3432. 【GDOI2014模拟】服务器
2024-10-20 11:45:34
题目
解析
很容易想到的 \(dp\):
设 \(f_i\) 表示已经处理完 \(1..i\) 并且 \(i\) 是直接复制的需要的最小花费
那么 \(f_i=f_j+(i-j) \times (i-j-1)+c_i\)
这就是经典的斜率优化 \(dp\),一般我们考虑两个决策谁会更优
考虑 \(j,k\) 两个决策,那么我们可以列个不等式,把它化成只关于 \(j\) 的式子和只关于 \(k\) 的式子放一边,剩下的放一边
再写成斜率的形式,具体分析怎么维护
式子如下:
\[\frac{2f_j+j^2+j-2f_k-k^2-k}{2j-2k} < i
\]
\]
小于号维护下凸壳,斜率和横坐标都单调增,可以用单调队列维护
\(Code\)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5;
const LL INF = 1e15;
int n;
LL f[N] , c[N] , q[N];
inline double slope(int x , int y)
{
return (2.0 * f[y] + 1.0 * y * y + y - (2.0 * f[x] + 1.0 * x * x + x)) / (2.0 * y - 2.0 * x);
}
int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%lld" , c + i);
int h = 1 , t = 1;
q[h] = 0;
for(register int i = 1; i <= n; i++)
{
while (h < t && slope(q[h] , q[h + 1]) < i) h++;
f[i] = f[q[h]] + (LL)(i - q[h]) * (i - q[h] - 1) / 2 + c[i];
while (t > h && slope(q[t - 1] , q[t]) > slope(q[t] , i)) t--;
q[++t] = i;
}
printf("%lld\n" , f[n]);
}
最新文章
- 【XLL 框架库函数】 TempActiveRow/TempActiveRow12
- 解决windows 2003 无法安装vss2005的问题
- Leetcode026. Remove Duplicates from Sorted Array
- Microsoft.Web.Administration in IIS
- PIMPL设计模式的理解和使用
- Session 转台服务器的使用方法
- bunoj 34990(hash)
- hdu1292(递推dp)
- let 和 var定义变量的区别-盼盼Degenerate
- jira7.3.6的安装步骤
- dijistra
- LeetCode算法题-Third Maximum Number(Java实现-四种解法)
- MyBatis-Helloworld
- net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用
- 【接口时序】7、VGA接口原理与Verilog实现
- Wordpress 更新时 不输入ftp相关信息的方法
- iOS 10跳转到其他app
- 基于TransactionScope类的分布式隐式事务
- MVC ---- 增删改成 EF6
- linux awk命令详解--转载
热门文章
- 除了 filter 还有什么置灰网站的方式?
- 2.9:数据交换-csv、Excel、json、爬虫、Tushare获取数据
- 深入理解 Python 的对象拷贝和内存布局
- 用Dockerfile制作一个java应用镜像,ubuntu基础篇
- .net core操作MongoDB
- [Unity]Unity更改黑色主题(个人版)
- 10.关于synchronized的一切,我都写在这里了
- 2023牛客寒假算法基础集训营1 ACDEFGHKLM
- 图文并茂记录下重新配置Win10系统Flutter环境--内含Android Studio 下载安装教程
- 集合框架-Collection集合