Frog 3 题解
题目大意
题意都这么明确了还要这个干什么。
存在 \(n\) 个点,每个点有一个属性 \(h_i\),\(h_i\) 单增,从点 \(i\) 移动到点 \(j(j>i)\) 的代价是 \((h_i-h_j)^2+C\),其中 \(C\) 是给定的常数,求从点 \(1\) 移动到点 \(n\) 的最小代价。
思路分析
斜率优化 DP 板题。
设 \(f_i\) 表示从点 \(1\) 移动到点 \(i\) 的最小代价,容易列出状态转移方程:
\]
直接转移是 \(O(n^2)\) 的,考虑斜率优化:
\]
将第 \(i\) 个状态视为平面上的点 \((h_i,f_i+h_i^2+C)\),问题转化为求斜率固定的直线的截距的最小值,考虑到 \(h_i\) 单增,故点的横坐标单增,斜率也单增。使用单调队列维护下凸壳即可。
代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=200200;
#define int long long
#define y(i) (i[f]+i[h]*i[h]+C)
#define x(i) (i[h])
#define k(i) (2*i[h])
int n,C,hh,tt;
int q[N],f[N],h[N];
double slope(int i,int j){
return 1.0*(y(i)-y(j))/(x(i)-x(j));
}
signed main(){
scanf("%lld%lld",&n,&C);
for(int i=1;i<=n;i++) scanf("%lld",&i[h]);
hh=1;tt=1;hh[q]=1;
for(int i=2;i<=n;i++){
while(hh<tt&&slope(hh[q],(hh+1)[q])<k(i)) hh++;
i[f]=hh[q][f]+(i[h]-hh[q][h])*(i[h]-hh[q][h])+C;
while(hh<tt&&slope(i,(tt-1)[q])<slope((tt-1)[q],tt[q])) tt--;
(++tt)[q]=i;
}
cout<<n[f]<<'\n';
return 0;
}
Frog 3 题解的更多相关文章
- CF1324C Frog Jumps 题解
原题链接 简要题意: 现在河面上有 \(n+2\) 块石头,编号 \(0\) 到 \(n+1\),\(1\)~\(n\) 块石头每块上有一个方向,如果是 \(L\),那么青蛙到这块石头上之后只能往左跳 ...
- CF1077A Frog Jumping 题解
Content 在一个数轴上有一个动点,初始时在 \(0\) 这个位置上,接下来有若干次操作,对于第 \(i\) 次操作: 如果 \(i\) 是奇数,那么动点往右移 \(a\) 个单位. 如果 \(i ...
- 2017-2018 ACM-ICPC Latin American Regional Programming Contest J - Jumping frog 题解(gcd)
题目链接 题目大意 一只青蛙在长度为N的字符串上跳跃,"R"可以跳上去,"P"不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1 ...
- CF53C Little Frog 题解
Content 有一只小青蛙想游历 \(n\) 块土堆,它现在在 \(1\) 号土堆上,每次可以跳跃任意距离到达另外的一个土堆.它想让每次跳跃的距离都不相等,试找到这样的一个方案. 数据范围:\(1\ ...
- hdu5037 Frog (贪心)
http://acm.hdu.edu.cn/showproblem.php?pid=5037 网络赛 北京 比较难的题 Frog Time Limit: 3000/1500 MS (Java/Othe ...
- CF #305 (Div. 2) C. Mike and Frog(扩展欧几里得&&当然暴力is also no problem)
C. Mike and Frog time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- HDU 5578 Friendship of Frog 水题
Friendship of Frog Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...
- 更新一波题解(最近做的三个dp题)
很久没写题解了,去ec之前来填一填坑,希望能攒攒人品... 首先是去年上海F题..uvalive7143 题意: 给n个人分 m间房子,每个房间的容量是已知的,其中有k对双胞胎,双胞胎可以看作相同的人 ...
- The Frog's Games(二分)
The Frog's Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) ...
- Friendship of Frog(水题)
Friendship of Frog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
随机推荐
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...
- SSE图像算法优化系列三十一:RGB2HSL/RGB2HSV及HSL2RGB/HSV2RGB的指令集优化-上。
RGB和HSL/HSV颜色空间的相互转换在我们的图像处理中是有着非常广泛的应用的,无论是是图像调节,还是做一些肤色算法,HSL/HSV颜色空间都非常有用,他提供了RGB颜色空间不具有的一些独特的特性, ...
- 如何有效检测、识别和管理 Terraform 配置漂移?
作者|Krishnadutt Panchagnula 翻译|Seal软件 链接|https://betterprogramming.pub/detecting-identifying-and-mana ...
- tcpdump 常用命令
最后更新时间 2021-10-05. Linux 的命令太多,tcpdump 是一个非常强大的抓包命令. 有时候想看线上发生的一些问题: nginx 有没有客户端连接过来-- 客户端连接过来的时候 P ...
- 分别在Windows系统和Linux系统环境安装anaconda3和tensorflow
Windows系统环境 一.安装anaconda 这里安装的是Anaconda3-2019.03-Windows-x86_64.exe(python3.7版本) 二.检查安装环境 1.若anacond ...
- pip安装pyinstaller失败的解决方法
错误情况: 从下面错误来看,是安装build的依赖失败 解决方法: 下载setup.py文件来安装 1.先下载 pyinstaller的安装文件,下载地址:http://www.pyinstaller ...
- shell: logging + readlog
logging #!/bin/bash # a small tool for logging sommething # # 1. read your input # 2. save to logs f ...
- [ansible]简介安装入门
简介 ansible是一种运维自动化工具,默认通过ssh协议管理机器.只需要在一台机器上安装好,就可以通过这台电脑管理一组远程的机器.而被管理的linux机器只要有python环境,就不需要额外安装a ...
- 从源码角度了解Vue生命周期
每个Vue应用都是通过new Vue()创建一个Vue实例开始.Vue()函数可以传入选项Options,常见的有el.template和data选项等. el 只在new创建实例时生效,其值可以是一 ...
- Jni GetMethodID中函数标识sig的详细解释
在 JNI(Java Native Interface)中,GetMethodID 函数用于获取 Java 类的方法的标识符.这个函数的详细解释如下: cCopy code jmethodID Get ...