正题

题目链接:https://www.ybtoj.com.cn/contest/116/problem/2


题目大意

nnn个点,xxx坐标递增,第iii个点向第jjj个点连边。

开始一个人在点sss,他会向他看到过的yyy坐标最大的点的方向走(两个点之间能够看到当且仅当它们之间没有边或者点)。

求对于每个sss走到yyy坐标最大的点的经过点数。

yyy值同样的以编号大的算大

1≤n≤5×105,1≤xi,yi≤1061\leq n\leq 5\times 10^5,1\leq x_i,y_i\leq 10^61≤n≤5×105,1≤xi​,yi​≤106


解题思路

先考虑每个点能看到的最高的点。

维护一个前缀的上凸壳,然后每次把该点连接的那个点就是这个点在凸壳方向能看到的最高的点。

左右各做一次就好了。

然后考虑怎么处理答案,先把所有点按照目标点的高度排序,然后每个点找到它的方向上在它前面的第一个点作为它的真正目标点。然后倒序转移就好了。

找真正目标点的过程可以反过来然后用链表实现

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(写基排就O(n)O(n)O(n)了)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10;
ll n,x[N],y[N],pos[N],s[N],l[N],r[N],p[N],f[N];
ll xj(ll a,ll b,ll c){ll x1=x[b]-x[a],y1=y[b]-y[a];ll x2=x[c]-x[a],y2=y[c]-y[a];return x1*y2-x2*y1;
}
bool cmp(ll a,ll b){return y[p[a]]*n+p[a]<y[p[b]]*n+p[b];
}
signed main()
{//  freopen("mountain.in","r",stdin);
//  freopen("mountain.out","w",stdout);scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld%lld",&x[i],&y[i]),pos[i]=i;ll top=0;s[++top]=1;for(ll i=2;i<=n;i++){while(top>1&&xj(s[top-1],s[top],i)>0)top--;p[i]=s[top];s[++top]=i;}top=1;s[top]=n;for(ll i=n-1;i>=1;i--){while(top>1&&xj(s[top-1],s[top],i)<0)top--;if(y[s[top]]>=y[p[i]])p[i]=s[top];s[++top]=i;}for(ll i=1;i<=n;i++)if(y[p[i]]*n+p[i]<y[i]*n+i)p[i]=0;y[0]=1e9;sort(pos+1,pos+1+n,cmp);for(ll i=1;i<=n;i++)l[i]=i-1,r[i]=i+1;for(ll i=1;i<n;i++){ll x=pos[i];if(p[x]>x)p[x]=r[x];else p[x]=l[x];l[r[x]]=l[x];r[l[x]]=r[x];}for(ll i=n-1;i>=1;i--){ll x=pos[i];f[x]=f[p[x]]+abs(p[x]-x);}for(ll i=1;i<=n;i++)printf("%lld\n",f[i]);return 0;
}

YbtOJ#482-爬上山顶【凸壳,链表】相关推荐

  1. 想要一览众山小,就得有爬上山顶的决心和爬山的坚持,两者缺一不可! ----2020年度总结

    成功并不是在决定那一刻就来到的,而是决定之后每天坚持坚持一点点走向成功的!---前言 每天起来的第一件事情就是打开手机,然后进入csdn进行签到,我很喜欢签到中的那句话,大概就是我前言中的那个意思吧, ...

  2. 爬山--登上山顶的方式有多少种?

    爬山问题 ---- 昨天做了个华为机试题目,部门是智能运算. 题目:(原题背不了,以下是大概意思.) 一个人要爬上山顶, 需要通过一个阶梯,阶梯的步数为正整数N(N>0 && N ...

  3. YbtOJ#853-平面标记【整体二分,凸壳】

    正题 题目链接:http://www.ybtoj.com.cn/contest/119/problem/3 题目大意 给出nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),mmm次给出(k ...

  4. 利用OpenCV的convexHull和convexityDefects做凸包(凸壳)检测及凸包(凸壳)的缺陷检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 要理解凸包(凸壳)检测,首无要知道什么是凸包(凸 ...

  5. P3291-[SCOI2016]妖怪【凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P3291 题目大意 给出 nnn 个数字对 (atk,dnf)(atk,dnf)(atk,dnf),求一个(a,b) ...

  6. P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P5540 题目大意 给出nnn个点mmm条边边权是一个二元组(ai,bi)(a_i,b_i)(ai​,bi​),求出 ...

  7. P3309-[SDOI2014]向量集【线段树,凸壳】

    正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 nnn个操作 在序列末尾加入一个向量(x,y)(x,y)(x,y) 询问加入的第l∼rl\sim ...

  8. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...

    学习DIP第14天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  9. 时空旅行[线段树分治][维护凸壳]

    文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...

最新文章

  1. R语言将dataframe长表转化为宽表实战:使用reshape函数、使用tidyr包的spread函数、使用data.table
  2. mysql 函数,关键字,特性
  3. Caffe、TensorFlow、MXnet三库对比
  4. RHEL环境下调试Shell脚本时遇到字符串转换整数的问题
  5. [Medical Image Process] 3.3 Grayscale Morphology Application
  6. 每个工程师都应该了解的:聊聊幂等
  7. hive的metatable学习
  8. Makefile (二)
  9. linux中ls文件内存大小,Linux下用ls和du命令查看文件以及文件夹大小
  10. symfony框架_为什么我们放弃传统的Symfony框架
  11. git添加多远端服务器并且实现push代码
  12. python获取同音字
  13. 移动边缘计算——计算卸载
  14. msdn原版系统和原版office
  15. java实现pdf旋转_java-Apache PDFBox旋转PDImageXObject
  16. IDEA 黄色警告 found duplicated code in this file finds duplicated code
  17. Elasticsearch 之(20)proximity match 近似匹配
  18. OpenStack Swift集群部署流程与简单使用
  19. 今天参加了聚思力面试
  20. 给家人们整无语了!教你用Python绘制流汗黄豆

热门文章

  1. 如何将手机投屏到电脑_手机如何投屏到电脑上?详细教程看这里,手机投屏
  2. java 双向链表_java集合类之LinkedList
  3. 计算机技术级生活中的应用,人工智能技术在计算机中的发展与应用
  4. Java之jdk与jre的区别
  5. win1编辑java环境,在win7下配置java编译环境
  6. 机器学习与气象数据_气象大数据与机器学习联合实验室 大数据和气象的“联姻”...
  7. Java程序设计当中包的使用_【学习笔记】 唐大仕—Java程序设计 第4讲 类、包和接口之4.2 类的继承...
  8. linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动
  9. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID
  10. 宝塔部署node项目_宝塔面板部署 node.js 项目