正题

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


题目大意

\(n\)个点,\(x\)坐标递增,第\(i\)个点向第\(j\)个点连边。

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

求对于每个\(s\)走到\(y\)坐标最大的点的经过点数。

\(y\)值同样的以编号大的算大

\(1\leq n\leq 5\times 10^5,1\leq x_i,y_i\leq 10^6\)


解题思路

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

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

左右各做一次就好了。

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

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

时间复杂度\(O(n\log 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. YbtOJ#853-平面标记【整体二分,凸壳】

    正题 题目链接:http://www.ybtoj.com.cn/contest/119/problem/3 题目大意 给出\(n\)个点\((x_i,y_i)\),\(m\)次给出\((k_i,a_i ...

  2. BZOJ 3672 [Noi2014]购票 (熟练剖分+凸壳维护)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3672 题意:给出一棵有根树(1为根),边有长度.每个点u有三个属性(len[u], ...

  3. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  4. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

  5. bzoj 1007 凸壳

    首先明确一个概念 左面内个叫上凸壳,右面那个叫下凸壳 然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标, 如果这条边的横坐标小就一直 ...

  6. [Gym101982M][思维好题][凸壳]Mobilization

    [gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...

  7. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Khamovniki Problem J Stairways解题报告(分块+维护凸壳)

    首先ORZ一发Claris聚聚的题解:http://www.cnblogs.com/clrs97/p/8689215.html,不然我可能没机会补过这道神题了. 这里写一个更详细的题解吧(我还是太菜了 ...

  8. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

  9. 【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳

    题面 ​出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了. 参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013 ...

随机推荐

  1. C++ 三数之和

    来自leecode做题时,发现的双指针用法,觉得挺有意思所以记录一下 链接:https://leetcode-cn.com/problems/3sum 题目: 给你一个包含 n 个整数的数组 nums ...

  2. Ubuntu的build-essential有什么作用

    Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装.但是如果单独安装gcc以及g++比较麻烦,幸运的是,Ubuntu提供了一个build-essential软件包.查看该软件包 ...

  3. Go: 复合数据类型struct

    结构体 结构体是将零个或多个任意类型的命名变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. type Employee struct { ID int Name string age int ...

  4. vscode如何配置ts的lint,如何配置才能让eslint和prettier不冲突一键格式化代码(vue开发使用)

    最近在使用ts,发觉tslint在vscode上使用很不方便,不如eslint一键格式化高效,就想着能不能配置下vscode让其像写js一样爽 这篇文章主要解决2个问题,第一个是如何让vscode使用 ...

  5. 🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」回顾Dubbo2.x的技术原理和功能实现及源码分析(温故而知新)

    RPC服务 什么叫RPC? RPC[Remote Procedure Call]是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范.它允许程序调用另一个地址空间(通常是共享网络的另 ...

  6. Java同步之线程池详解

    带着问题阅读 1.什么是池化,池化能带来什么好处 2.如何设计一个资源池 3.Java的线程池如何使用,Java提供了哪些内置线程池 4.线程池使用有哪些注意事项 池化技术 池化思想介绍 池化思想是将 ...

  7. Mysql基本知识整理

    一.简介 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 2.关系型数据库 ...

  8. 日常shell练习

    2021-07-19 1.echo的使用 1.1 echo -n 表示不换行输出 # echo输出会自动换行,换行输出两个1 echo 1 echo 1 # 不换行输出,不换行输出两个1 echo - ...

  9. 性能测试工具JMeter 基础(二)—— 主界面介绍

    主界面介绍 JMeter的主界面主要分为菜单导航栏.工具栏.计划树标签栏.内容栏 菜单导航栏:全部的功能的都包含在菜单栏中 工具栏:相当于菜单栏常用功能的快捷按钮 计划树标签栏:显示测试用例(计划)相 ...

  10. Python - 导入的位置

    导入的是什么 导入是将 Python 的一些功能函数放到当前的脚本中使用 不导入的功能无法直接在当前脚本使用(除了 python 自带的内置函数) Python 有很多第三方功能,假设想要使用,都必须 ...