LINK:爬山

很早以前看的题目 发现自己想的完全不对 这道题还是比较有价值的。

先不考虑走的路线问题 考虑某个点能看到的最高的山。

分左边和右边来考虑 考虑左边 利用单调栈存长度单调递减的山 不能直接取最高的 因为最高的山可能被遮住了。

然后分析到底哪座山可以取 设当前点为i 对于一个点k来说 如果存在j<k 且 j,k,i连线是一个下凸包那么k就没用了。

容易发现如果把这些下凸包删掉 就是一个上凸包了 取凸包上和i相邻的点即可。

至此 得到一个通解左边形成的凸包离i最近的点 右边同理。

接下来考虑 如何求答案 暴力模拟可能复杂度很高 因为从一座山走到另一座山的途中路线可能会被修改。

容易从中发现 当前点会到达某个点 某个点会继续走下去 此时高度比原来大。

显然 这种顺序不存在环 所以只要找到这样的顺序就可以快速得到答案了。

进一步的可以发现 每个点都会到达最高的那个点 所以这些关系形成了一棵树。

只要建出来树就可以线性得到答案了。或者不需要建立树 直接每次到达那个关键点采用记忆化搜索即可。

考虑对于某个点的关键点 离自己最远的那个点显然有可能是关键点。

要么就是在路径上的点是关键点。注意开long long.

const int MAXN=500010;
int n,top;
struct wy
{
int x,y;
}t[MAXN];
ll f[MAXN];int vis[MAXN];
int mx[MAXN],s[MAXN],fa[MAXN];
inline int pd(int i,int j,int k)
{
return (ll)(y(i)-y(j))*(x(j)-x(k))<(ll)(y(j)-y(k))*(x(i)-x(j));
}
inline ll dfs(int x)
{
if(vis[x])return f[x];
vis[x]=1;
if(!fa[x])return f[x];
return f[x]=dfs(fa[x])+abs(x-fa[x]);
}
int main()
{
freopen("1.in","r",stdin);
get(n);y(0)=-1;
rep(1,n,i)get(x(i)),get(y(i));
rep(1,n,i)
{
while(top>1&&pd(s[top-1],s[top],i))--top;//形成下凸包.
mx[i]=s[top];s[++top]=i;
}
top=0;
fep(n,1,i)
{
while(top>1&&pd(i,s[top],s[top-1]))--top;
mx[i]=y(s[top])>=y(mx[i])?s[top]:mx[i];s[++top]=i;
}
fep(n,1,i)if(y(mx[i])<=y(i)){mx[i]=i;break;}
top=0;
rep(1,n,i)
{
while(top&&(y(mx[i])>y(mx[s[top]])||(y(mx[i])==y(mx[s[top]])&&x(mx[i])>x(mx[s[top]]))))--top;
if(mx[i]<i)fa[i]=s[top];s[++top]=i;
}
top=0;
fep(n,1,i)
{
while(top&&(y(mx[i])>y(mx[s[top]])||(y(mx[i])==y(mx[s[top]])&&x(mx[i])>x(mx[s[top]]))))--top;
if(mx[i]>i)fa[i]=s[top];s[++top]=i;
}
rep(1,n,i)dfs(i),putl(f[i]);
return 0;
}

一本通 高手训练 1788 爬山 dp 斜率 凸包的更多相关文章

  1. 一本通 高手训练 1782 分层图 状压dp

    LINK:分层图 很精辟的一道题 写的时候没带脑子 导致搞了半天不知道哪错了. 可以想到状压每次到某一层的状态 然后这个表示方案数 多开一维表示此时路径条数的奇偶即可. 不过显然我们只需要知道路径条数 ...

  2. 一本通 高手训练 1781 死亡之树 状态压缩dp

    LINK:死亡之树 关于去重 还是有讲究的. 题目求本质不同的 具有k个叶子节点的树的个数 不能上矩阵树. 点数很少容易想到装压dp 考虑如何刻画树的形状 发现一个维度做不了 所以. 设状态 f[i] ...

  3. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  4. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  5. 学渣乱搞系列之dp斜率优化

    学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...

  6. dp斜率优化

    算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...

  7. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  8. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  9. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

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

随机推荐

  1. Instrction Arrangement UDH 4109 拓扑排序 or 最长路

    题目描述 Ali has taken the Computer Organization and Architecture course this term. He learned that ther ...

  2. Centos 6.4最小化安装后的优化(2)

    1.关闭不必要的服务 众所周知,服务越少,系统占用的资源就会越少,所以应当关闭不需要的服务器.首先可以先看下系统中存在哪些已经开启了的服务.查看命令如下: ntsysv 下面列出的是需要启动的服务器, ...

  3. 蕴含式(包含EXISTS语句的分析)

    *{ font-family: STFangSong; outline: none; } 蕴含式 一.蕴含式基础 (Ⅰ)什么是"蕴含式" 设p.q为两个命题.复合命题"如 ...

  4. requests接口自动化7-Multi/form-data文件上传形式的post请求:files

    Multi/form-data文件上传形式的post请求:用files传参 fiddler里请求响应内容; 代码: import requests from requests_toolbelt imp ...

  5. hihoCoder 1037 数字三角形 最详细的解题报告

    题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public ...

  6. 009.Nginx缓存及配置

    一 浏览器缓存 1.1 缓存概述 缓存对于Web至关重要,尤其对于大型高负载Web站点.Nginx缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载.通常对于静态资源,即较少经常更新的资源 ...

  7. Python Ethical Hacking - VULNERABILITY SCANNER(8)

    Implementing Code To Discover XSS in Parameters 1. Watch the URL of the XSS reflected page carefully ...

  8. vue : 本地调试跨域问题的解决办法:proxyTable

    本来我是不想写的,但为了加深印象还是写一写吧. ./config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'st ...

  9. Makefile中的一个坑

    问题描述:Makefile中,我想将一个变量的后缀全部进行替换,如将所有的.c后缀变成.d后缀 方法:$(CUR_SOURCE: .c = .d ) 说明:查阅相关资料,了解到上述这种语法就可以将所有 ...

  10. 视图相关SQL

    前面介绍了视图的概念和作用,接下来简单的用实例SQL来展现视图. 例如:首先,创建表e_information.表e_shareholder: 然后插入表数据等,在此,这简单的部分我就省略了,直接写视 ...