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. 你不知道的前端SDK开发技巧

    最近在做公司内部的一个的一个SDK的重构,这里总结一些经验分享给大家. 类型检查和智能提示 作为一个SDK,我们的目标是让使用者能够减少查看文档的时间,所以我们需要提供一些类型的检查和智能提示,一般我 ...

  2. 聊聊Java

    聊聊Java 笔记源于 视频教程Bilibili:狂神说Java 关注公众号:狂神说 能干嘛? 热度 TIOBE 狂神计划 三高:高可用.高性能.高并发 全球几千万的程序员都会Java,真正精通的不到 ...

  3. Django的Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  4. redis必知会

    Redis 是单进程单线程的? Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销. Redis 的持久化机制是什么?各自的优缺点? Red ...

  5. 太实用了!自己动手写软件——GUI编程

    这几天我有一个想法就是将我之前做测试写的一些协议脚本(如:ssh.FTP.SMTP.MySQL.Oracle等)综合在一起做一个密码PJ器,这么多的协议放在一起,每个协议都有自己特殊的参数,如果还是和 ...

  6. 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选

    在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...

  7. 在 vue 中使用 WebSocket

    <template> <div class="hello"> <h1>{{ msg }}</h1> <h1>{{ res ...

  8. 完美解决pycharm 不显示代码提示问题

    pycharm 不显示代码提示 1.检查IDE省电模式是否关闭状态!!! file → power save mode 取消掉 2.检查代码提示是否成功开启. setting → Inspection ...

  9. 【C++】初次学习C++指针时的一些易混或疑惑的地方

    C++中的指针是一个比较复杂的知识概念,最近我有在学习这一方面的知识,就借此文章记录一下在学习时容易产生的混淆.本人初次发技术类的分享,可能会有纰漏,欢迎诸位指正^_^! 1.*在两种语境下的含义 先 ...

  10. 硬核干货:5W字17张高清图理解同步器框架AbstractQueuedSynchronizer

    前提 并发编程大师Doug Lea在编写JUC(java.util.concurrent)包的时候引入了java.util.concurrent.locks.AbstractQueuedSynchro ...