正题

题目链接: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. python编程指南

    1.python文件引入同一个模块的python文件, 在命令行执行的时候需要定位到模块内部,加入参数PYTHONPATH=../ 在pycharm中  import package一般都是按照绝对路 ...

  2. web整合Spring和Hibernate

    上一篇是简单整合web和Spring, 这一篇是整合hibernate: 连接池c3p0: spring5.0, hibernate5.0 jars: ------------------------ ...

  3. mzy git学习,删除文件(三)

    删除一个文件(工作区删除,并且在本地版本库中也删除) 第一种方式: rm test.txt 先删除工作区的test.txt git add test.txt (我的理解是,将删除test.txt这个动 ...

  4. 并发编程之:JMM

    并发编程之:JMM 大家好,我是小黑,一个在互联网苟且偷生的农民工. 上一期给大家分享了关于Java中线程相关的一些基础知识.在关于线程终止的例子中,第一个方法讲到要想终止一个线程,可以使用标志位的方 ...

  5. rtvue-lowcode:一款基于uniapp框架和uview组件库的开源低代码开发平台

    rtvue-lowcode低代码开发平台 rtvue-lowcode一款基于uniapp框架和uview组件库的低代码开发平台,项目提供可视化拖拽编辑器,采用MIT开源协议,适用于app.小程序等项目 ...

  6. 高性能利器:CDN我建议你好好学一下!

    硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! CDN 概述 CDN 全称 Content Delivery Netwo ...

  7. Learning to Compare: Relation Network for Few-Shot Learning 论文笔记

    主要原理: 和Siamese Neural Networks一样,将分类问题转换成两个输入的相似性问题. 和Siamese Neural Networks不同的是: Relation Network中 ...

  8. 用C++实现的增强Eratosthenes筛法程序

    运行示例 PS H:\Read\num\x64\Release> .\eSievePro Eratosthenes sieve: a method to find out all primes ...

  9. Python3-sqlalchemy-orm 创建多表关联表带外键

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  10. 通过 layout 探索 kratos 运行原理

    创建项目 首先需要安装好对应的依赖环境,以及工具: go 下载 protoc go install google.golang.org/protobuf/cmd/protoc-gen-go@lates ...