l[i],r[i]表示站在i点往左往右走能看到的最高峰,用栈维护凸壳求出

h[i]表示i点能看到的最高峰的高度

a[i],b[i]表示i点往左往右走时反悔的点,即第一个h[j]>h[i]的j,用单调栈求出

然后建树DFS一遍求出答案

#include<cstdio>
#define N 200010
typedef long long ll;
int n,i,x[N],y[N],l[N],r[N],q[N],a[N],b[N],t,g[N],nxt[N],v[N],ed,d[N],f[N];ll Y[N],h[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline int abs(int x){return x>0?x:-x;}
void dfs(int x){for(int i=g[x];i;i=nxt[i])f[v[i]]=f[x]+abs(x-v[i]),dfs(v[i]);}
int main(){read(n);for(y[0]=y[n+1]=-1,i=1;i<=n;i++)read(x[i]),read(y[i]),Y[i]=1000000LL*y[i]+i;for(q[t=0]=n,i=n-1;i;q[++t]=i--){while(t&&(ll)(y[q[t]]-y[i])*(x[q[t-1]]-x[q[t]])<=(ll)(y[q[t-1]]-y[q[t]])*(x[q[t]]-x[i]))t--;r[i]=q[t];}for(q[t=0]=1,i=2;i<=n;q[++t]=i++){while(t&&(ll)(y[q[t]]-y[i])*(x[q[t-1]]-x[q[t]])>=(ll)(y[q[t-1]]-y[q[t]])*(x[q[t]]-x[i]))t--;l[i]=q[t];}for(i=1;i<=n;i++){if(Y[i]>Y[l[i]])l[i]=0;if(Y[i]>Y[r[i]])r[i]=n+1;h[i]=Y[i];if(Y[l[i]]>h[i])h[i]=Y[l[i]],d[i]=1;if(Y[r[i]]>h[i])h[i]=Y[r[i]],d[i]=2;}h[0]=h[n+1]=1LL<<60;for(q[t=0]=0,i=1;i<=n;q[++t]=i++){while(h[i]>h[q[t]])t--;a[i]=q[t]>l[i]?q[t]:l[i];}for(q[t=0]=n+1,i=n;i;q[++t]=i--){while(h[i]>h[q[t]])t--;b[i]=q[t]<r[i]?q[t]:r[i];}for(i=1;i<=n;i++){if(!d[i])t=i;if(d[i]==1)add(a[i],i);if(d[i]==2)add(b[i],i);}for(dfs(t),i=1;i<=n;i++)printf("%d\n",f[i]);return 0;
}

  

转载于:https://www.cnblogs.com/clrs97/p/4403199.html

BZOJ3755 : Pty爬山相关推荐

  1. bzoj 3755: Pty爬山

    称关键点为使其改变目标的点,从一个点出发,到达的关键点是确定的,且如果一条路径上到达某个点为关键点,那么之后的路径和从这个点出发的路径相同,所以我们就要找出每个点出发走到的下一个关键点. 首先找到每个 ...

  2. 免费idc公益接口_数据科学促进社会公益免费开放数据的最佳来源

    免费idc公益接口 内容(Contents) Introduction 介绍 What is Open Data? 什么是开放数据? Open vs. Free vs. Online Data 开放与 ...

  3. 手机 java服务器ip地址_java获取系统当前服务器IP地址

    BZOJ-1008 越狱 数论快速幂 1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6192 Solved: 26 ...

  4. 为什么说,长跑和爬山能锻炼意志?因为要不停的run,run,run......

    长跑和爬山教会我们的是无论做什么都要坚持,教会我们的是生活的态度. 如果不能体会到这一点,那你长跑的意义就是纯粹的锻炼身体. 中国教育的最大败笔就是教会了人学习,却没教会人思考.

  5. Linux关于终端的基本概念汇总(tty/pty)(转)

    在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种: 1.串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口 ...

  6. linux 伪终端 pty 简介

    伪终端 伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备.其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 ...

  7. linux下echo /dev/ttys* 到字符设备文件,linux之tty pty pts

    一.基本概念: 1> tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后 ...

  8. 推荐算法-聚类-均值偏移聚类(爬山算法)

    均值偏移(Mean shift)聚类算法是一种基于滑动窗口(sliding-window)的算法,它视图找到密集的数据点.而且,它还是一种基于中心的算法,他的目标是定位每一组群/类的中心点,通过更新中 ...

  9. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备支 ...

最新文章

  1. java iris_利用K-Means聚类算法实现对iris.data.ulab
  2. Pacbio HiFi技术原理与应用软件实例
  3. 项目经理如何有效地进行项目沟通?
  4. linux 打印函数宏,linux内核中的嵌入式汇编宏函数
  5. LAMP服务搭建详解
  6. win7虚拟磁盘服务器,Win7系统如何删除虚拟磁盘 win7系统删除虚拟磁盘的方法
  7. Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表
  8. android qq红点,Android高仿QQ小红点功能
  9. android本地图片选择(相册选取,相机拍摄)
  10. 153.寻找旋转排序数组中的最小值(力扣leetcode) 博主可答疑该问题
  11. 高斯勒让德数值积分公式
  12. java Doc转Pdf
  13. oracle 抽样_利用ORACLE实现数据抽样
  14. css中reset属性详解,css中如何使用counter-reset属性
  15. 2021校招滴滴笔试sql
  16. 全球互联网的致命软肋——边界网关协议
  17. 服务器连无线路由器视频教程,远程服务器路由器设置教程视频
  18. 摄像头在线测试_Leez学院| 面部检测 精准可靠 Leez P515 OpenCV工程测试
  19. 用好商品说话、为消费者服务、为全行业赋能:值得买科技618战报发布
  20. oracle计算两个日期的相差的小时数、分钟数、秒数

热门文章

  1. 有哪些在成都开了 20 年以上的味道不错的小饭馆
  2. 2021年美容师(高级)考试及美容师(高级)考试题
  3. 【解决方案】谈公众号红包的正确打开方式--传奇创世
  4. 金额格式化,符号位,保留两位小数
  5. 2020年Android GMS 认证 boot logo 最新要求
  6. html5指纹特效,小米11指纹特效很神奇这样设置
  7. flutter图片预览_flutter好用的轮子推荐四-可定制的图片预览查看器photo_view
  8. 7-47 打印选课学生名单 (25分)C++
  9. rt-thread通过spi连接W25Q32后无法读取ID
  10. 连着恰饭,还能有1000w播放?B站商单案例拆解