正题

题目链接: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. Windows 10 - View SIM Card Number

     If your device isn't running Windows 10, refer to the Windows 8 instructions. From the Windows desk ...

  2. OGNL表达式入门

    package com.scorpion.ognl; import java.util.ArrayList; import java.util.List; import ognl.Ognl; impo ...

  3. 深入浅出Mybatis系列(五)---配置详解之settings设置

    settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...

  4. Redis3.0.0集群一键脚本 -by古斌

    下载地址(以交由码云托管): https://gitee.com/gubin0412/Redis3.0.0 赋予脚本执行权限  chmod +x redis-gubin.sh 使用 ./redis-g ...

  5. linux(3)--------SSH工具的安装使用

    0.一般安装服务端的Linux ssh是默认安装的可以运行ssh localhost测试一下是否可以链接 1.SSH是什么 1)ssh:Secure Shell  安全外壳协议 2)建立在应用层基础上 ...

  6. jQuery中的基本过滤选择器(四、三)::first、:last、:not() ... ...

    <!DOCTYPE html> <html> <head> <title>基本过滤选择器</title> <meta http-equ ...

  7. Ubuntu 16.04 NVidia显卡 输入密码后 重复出现登录界面

    问题根源:显卡驱动 解决办法: CTRL+ALT+F1 # 切换到命令行 sudo service lightdm stop  # 关闭桌面显示管理器 sudo apt-get remove --pu ...

  8. MySQL-SQL基础-子查询

    #子查询-某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就要用到子查询.用于子查询的关键字主要包括: in.not in.=.!=.exists.not exist ...

  9. SpringBoot笔记(7)

    一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...

  10. SpringBoot笔记(6)

    一.数据访问(SQL) 1.数据源的自动配置-HikariDataSource 1.导入JDBC场景 <dependency> <groupId>org.springframe ...