BZOJ3755 : Pty爬山
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爬山相关推荐
- bzoj 3755: Pty爬山
称关键点为使其改变目标的点,从一个点出发,到达的关键点是确定的,且如果一条路径上到达某个点为关键点,那么之后的路径和从这个点出发的路径相同,所以我们就要找出每个点出发走到的下一个关键点. 首先找到每个 ...
- 免费idc公益接口_数据科学促进社会公益免费开放数据的最佳来源
免费idc公益接口 内容(Contents) Introduction 介绍 What is Open Data? 什么是开放数据? Open vs. Free vs. Online Data 开放与 ...
- 手机 java服务器ip地址_java获取系统当前服务器IP地址
BZOJ-1008 越狱 数论快速幂 1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6192 Solved: 26 ...
- 为什么说,长跑和爬山能锻炼意志?因为要不停的run,run,run......
长跑和爬山教会我们的是无论做什么都要坚持,教会我们的是生活的态度. 如果不能体会到这一点,那你长跑的意义就是纯粹的锻炼身体. 中国教育的最大败笔就是教会了人学习,却没教会人思考.
- Linux关于终端的基本概念汇总(tty/pty)(转)
在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种: 1.串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口 ...
- linux 伪终端 pty 简介
伪终端 伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备.其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 ...
- linux下echo /dev/ttys* 到字符设备文件,linux之tty pty pts
一.基本概念: 1> tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后 ...
- 推荐算法-聚类-均值偏移聚类(爬山算法)
均值偏移(Mean shift)聚类算法是一种基于滑动窗口(sliding-window)的算法,它视图找到密集的数据点.而且,它还是一种基于中心的算法,他的目标是定位每一组群/类的中心点,通过更新中 ...
- linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备支 ...
最新文章
- java iris_利用K-Means聚类算法实现对iris.data.ulab
- Pacbio HiFi技术原理与应用软件实例
- 项目经理如何有效地进行项目沟通?
- linux 打印函数宏,linux内核中的嵌入式汇编宏函数
- LAMP服务搭建详解
- win7虚拟磁盘服务器,Win7系统如何删除虚拟磁盘 win7系统删除虚拟磁盘的方法
- Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表
- android qq红点,Android高仿QQ小红点功能
- android本地图片选择(相册选取,相机拍摄)
- 153.寻找旋转排序数组中的最小值(力扣leetcode) 博主可答疑该问题
- 高斯勒让德数值积分公式
- java Doc转Pdf
- oracle 抽样_利用ORACLE实现数据抽样
- css中reset属性详解,css中如何使用counter-reset属性
- 2021校招滴滴笔试sql
- 全球互联网的致命软肋——边界网关协议
- 服务器连无线路由器视频教程,远程服务器路由器设置教程视频
- 摄像头在线测试_Leez学院| 面部检测 精准可靠 Leez P515 OpenCV工程测试
- 用好商品说话、为消费者服务、为全行业赋能:值得买科技618战报发布
- oracle计算两个日期的相差的小时数、分钟数、秒数
热门文章
- 有哪些在成都开了 20 年以上的味道不错的小饭馆
- 2021年美容师(高级)考试及美容师(高级)考试题
- 【解决方案】谈公众号红包的正确打开方式--传奇创世
- 金额格式化,符号位,保留两位小数
- 2020年Android GMS 认证 boot logo 最新要求
- html5指纹特效,小米11指纹特效很神奇这样设置
- flutter图片预览_flutter好用的轮子推荐四-可定制的图片预览查看器photo_view
- 7-47 打印选课学生名单 (25分)C++
- rt-thread通过spi连接W25Q32后无法读取ID
- 连着恰饭,还能有1000w播放?B站商单案例拆解