题目链接


Solution

斜率优化\(DP\). 今天下午才打的第一道题 QwQ...

\(90\) 分很简单,一个简单的递推.

令 \(f[i]\) 为最后一天旅游的花费, \(g[i]\) 为最后一天吃饭的花费.

转移很简单:

\(f_i=min(f_i,g_j+p*(i-j)^2);\)

\(g_i=min(g_i,f_j+q*(i-j));\)

时间复杂度 \(O(n^2)\),然后看优化.

对于 \(g[i]\),可以直接从\(1\)到\(i-1\)记录一个 \(Min(f[j]-q*j)\),然后就可以\(O(1)\)转移.

然后再看 \(f[i]\),将 \(f[i]\) 的转移方程整理后得:

\[f[i]+2*p*ij-p*i^2=g[j]+p*j^2
\]

此时化为 \(y=kx+b\) 的形式.

则令 :

\(2*p*j\) 为 \(x\);

\(i\) 为 \(k\);

\(f[i]-p*i\) 为 \(b\) ;

\(g[j]+p*j^2\) 为 \(y\) ;

且我们发现 \(k\) 递增,满足斜率优化要求.此处 \(g[i],g[j]\) 都已经求解出来.

那么此时我们要使得 \(f[i]\) 尽量小,也就是使得 \(b\) 最小.

然后就是用单调队列维护下凸包找到第一个比 \(k\) 大的斜率即可.

Q:为什么找第一个比 \(k\) 大的斜率??

此时我们需要使得 \(b\) 最小,\(b=x*(y/x-k)\) ,所以要使得 \(y/x\) 尽量小且大于 \(k\) 即可.

时间复杂度 \(O(n)\).

Code

//第一次打不会,只能对着别人打 QwQ...
#include<bits/stdc++.h>
#define ll long long
#define y(i) (g[i]+p*i*i)
#define x(i) (2*p*i)
using namespace std;
const int N=200005;
int n,r,l,Q[N];
ll p,q,Min,f[N],g[N];
int main(){
cin>>n>>p>>q;
for(int i=1;i<=n;i++)
{
g[i]=Min+q*i;
while(r>l&&i*(x(Q[l+1])-x(Q[l]))>=y(Q[l+1])-y(Q[l]))l++;
f[i]=g[Q[l]]+p*(i-Q[l])*(i-Q[l]);
Min=min(Min,f[i]-q*i);
while(r>l&&(y(i)-y(Q[r]))*(x(Q[r])-x(Q[r-1]))<=(x(i)-x(Q[r]))*(y(Q[r])-y(Q[r-1])))r--;
Q[++r]=i;
//单调队列维护第一个比 k 大的斜率.
}
printf("%lld\n",min(f[n],g[n]));
return 0;
}

P2134 百日旅行 (斜率优化,DP)的更多相关文章

  1. luogu P2134 百日旅行

    题目链接 luogu P2134 百日旅行 题解 dp方程好想吧 优化有些玄学惹 不会证.... 不过我会三分和贪心 \滑稽 但还是写dp吧 代码 #include<cstdio> #in ...

  2. 洛谷P2134 百日旅行

    P2134 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.——小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场大考时默 ...

  3. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  4. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  5. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  6. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  8. BZOJ 3156: 防御准备 斜率优化DP

    3156: 防御准备 Description   Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...

  9. HDU2829 Lawrence(斜率优化dp)

    学了模板题之后上网搜下斜率优化dp的题目,然后就看到这道题,知道是斜率dp之后有思路就可以自己做不出来,要是不事先知道的话那就说不定了. 题意:给你n个数,一开始n个数相邻的数之间是被东西连着的,对于 ...

随机推荐

  1. python 列表 字典转json

    一.Dictionary 转为JSON 将dict转为JSON,这里利用包json import jsonaItem = {}aItem["id"] = "2203&qu ...

  2. pandas的数据联级

    一.索引的堆(stack) 1.行列的转化: Stack():列转行 Unstack():行转列 Stack对应行, 使用小技巧:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行 ...

  3. mysql 备份 常用脚本

    全备: innobackupex --defaults-file=/data/mysql3316/my3316.cnf --user=root --password=mysqlpass /data/b ...

  4. SpringMVC 项目中引用其他 Module 中的方法

    1. 将要引用的Module 引入项目中 2. 在主Module中添加依赖, 3. 被引用的类必须放在 Module 中/src/下的某个package中,否则引用不到(重要)

  5. matplotlib学习记录 二

    # 绘制10点到12点的每一分钟气温变化折线图 import random from matplotlib import pyplot as plt # 让matplotlib能够显示中文 plt.r ...

  6. python能干什么?

    python能干什么? 网络爬虫 爬虫,指的是从互联网采集数据的程序脚本 . 爬天爬地爬空气 ,无聊的时候爬一爬吃鸡数据.b站评论,能得出很多有意思的结论.知乎有个很有意思的问题——"利用爬 ...

  7. STM32HAL学习博客

    https://www.cnblogs.com/wt88/category/1297945.html

  8. 线段树:HDU2795-Billboard(建树方式比较新奇)

    Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. PAT Basic 1082

    1082 射击比赛 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原 ...

  10. VS2017生成.net core项目报错:The current .NET SDK does not support targeting .NET Core 2.1. Either

    今天在生成一个项目的时候,生成报错,错误如下:The current .NET SDK does not support targeting .NET Core 2.1.  Either target ...