Description

Input

输入文件的第一行含有一个正整数 n,代表山的顶点数。
接下来 n 行,每行包含两个整数 x i 和 y i ,代表一个顶点的坐标。输入保证 x i单调递增。

Output

输出 n 行,第 i 行包含一个整数,代表从第 i 个顶点出发走到最高点需要经过多少段。

Sample Input

5
1 5
2 4
3 9
4 0
5 2

Sample Output

2
1
0
1
2

Data Constraint

Hint

Solution

  • 我们设 l[i] (r[i])l[i]\ (r[i]) 表示点 ii 向左(右)看能看到的点最高是哪一个。

  • 这用单调栈可以 O(N)O(N) 求出来——左右扫一遍就可以了。

  • 之后我们发现最难统计的就是一个点不断发现新的高点,从而一直拐弯。

  • 那么我们又设 fl[i] (fr[i])fl[i]\ (fr[i]) 表示点 ii 向左(右)第一个能看到更高点的位置。

  • 这我们也可以近乎 O(N)O(N) 求出来,一样是扫一遍,用前面的 fl[]fl[] 更新当前的 fl[i]fl[i] 。

  • 那么点 ii 能看到的最高高度就是 f[i]=max(fl[i],fr[i])f[i]=max(fl[i],fr[i]) ,走的方向也就确定了。

  • 之后我们以最高点为 rootroot ,连边 (fl[i],i)(fl[i],i) (或 fr[i]fr[i] ,以走的方向而定)。

  • 显然这是一个树结构,因为每个点始终会到最高点(一定连通),目标点又越来越高(没环)。

  • 于是跑一边 dfsdfs ,就能算出每个点走的段数了。

  • 时间复杂度近乎 O(N)O(N) 。

Code

#include<cstdio>
#include<cctype>
using namespace std;
const int N=2e5+5;
struct data
{int x;long long y;
}a[N];
int top,tot,root;
int first[N],nex[N],en[N];
int l[N],r[N],st[N],ans[N],fl[N],fr[N],fx[N];
long long f[N];
double d[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48),ch=getchar();return w?-X:X;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline double get(int x,int y)
{return (a[x].y-a[y].y)*1.0/(a[x].x-a[y].x);
}
inline int abs(int x)
{return x<0?-x:x;
}
void dfs(int x)
{for(int i=first[x];i;i=nex[i]){ans[en[i]]=ans[x]+abs(x-en[i]);dfs(en[i]);}
}
inline void insert(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;
}
int main()
{int n=read();for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();for(int i=1;i<=n;i++){while(top>1 && d[top]<=get(i,st[top])) top--;if(a[st[top]].y>a[i].y) l[i]=st[top];st[++top]=i;if(top>1) d[top]=get(i,st[top-1]);}top=0;for(int i=n;i;i--){while(top>1 && d[top]>=get(i,st[top])) top--;if(a[st[top]].y>=a[i].y) r[i]=st[top]; else r[i]=n+1;st[++top]=i;if(top>1) d[top]=get(i,st[top-1]);}r[n]=n+1;for(int i=1;i<=n;i++) a[i].y=a[i].y*1000000+i;for(int i=1;i<=n;i++){long long h=a[i].y;if(a[r[i]].y>h) h=a[r[i]].y,fx[i]=2;if(a[l[i]].y>h) h=a[l[i]].y,fx[i]=1;f[i]=h;}for(int i=1;i<=n;i++){int j=i-1;while(j && f[i]>=f[j]) j=fl[j];fl[i]=j?j:l[i];}for(int i=n;i;i--){int j=i+1;while(j<=n && f[i]>=f[j]) j=fr[j];fr[i]=j<=n?j:r[i];}for(int i=1;i<=n;i++)if(!fx[i]) root=i; elseif(fx[i]==1) insert(fl[i],i); else insert(fr[i],i);dfs(root);for(int i=1;i<=n;i++) write(ans[i]),putchar('\n');return 0;
}

JZOJ 3401 JZOJ 5673. 【GDOI2018Day1模拟4.20】爬山法相关推荐

  1. 备战Noip2018模拟赛20 (A组) T1 Cz 礼物

    10月24日备战Noip2018模拟赛20(A组) T1 Cz礼物 题目描述 有Ñ种物品,第I种物品的价格为六,每天最多购买XI个. 有米天,第我天c♂x有无线的钱,他会不停购买能买得起的最贵的物品( ...

  2. JZOJ 3693. 【NOI2014模拟6.20】慎二的随机数列

    Description 间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列,准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕祸福,柳洞一成路过时把间桐慎二的水杯打 ...

  3. JZOJ 5662. 【GDOI2018Day1模拟4.17】尺树寸泓

    Description Input Output Sample Input 3 4 1 2 3 1 0 0 1 0 0 2 1 0 1 2 2 2 1 Sample Output 3 6 2 Data ...

  4. JZOJ 3789. 【NOI2015模拟8.20】编辑器

    Description 你正在设计一种新型的编辑器,这种编辑器可以高效地处理整数序列. 编辑器启动时,序列为空,光标指向序列的头部.编辑器支持下列 5 种操作: 1. I x 把整数 x 插入到光标位 ...

  5. 2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)

    Begin (题目的排序方式:Unkown其实是按心情排的) 异或:(摘自百度百科) 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为"⊕",计算机符号为&quo ...

  6. JZOJ 3453【NOIP2013中秋节模拟】连通块

    原题 Description 你应该知道无向图的连通块的数量,你应该知道如何求连通块的数量.当你兴奋与你的成就时,破坏王Alice拆掉了图中的边.当她发现,每删去一条边,你都会记下边的编号,同时告诉她 ...

  7. 【jzoj 4727】【NOIP2015模拟10.28B组】终章-剑之魂 {贪心}

    题目 Description [背景介绍] 古堡,暗鸦,斜阳,和深渊-- 等了三年,我独自一人,终于来到了这里-- "终焉的试炼吗?就在这里吗?"我自言自语道. "终焉的 ...

  8. 【JZOJ 5776】【NOIP2008模拟】小x游世界树 (树)

    问题描述 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了, ...

  9. 【JZOJ 6079】【GDOI2019模拟2019.3.23】染色问题

    Description m≤n+5,k,n≤105m\leq n+5,k,n\leq10^5m≤n+5,k,n≤105 Solution 1 这个图只有5条返祖边所以才能做, 先把所有有返祖边的点拿出 ...

最新文章

  1. Verilog初级教程(21)Verilog中的延迟控制语句
  2. Python第四章__装饰器、迭代器
  3. 【C# 委托 Lambda表达式】一个简单的例子
  4. 它的斗争“和loser对话”短篇故事
  5. 裁判打分_内在的裁判偏见
  6. 应用安全-路由器安全-修复方案整理
  7. HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查
  8. Visual Studio开源库集成器Vcpkg全教程--利用Vcpkg轻松集成开源第三方库
  9. python爬数据实例_Python实例教程爬虫爬取NBA数据功能示例
  10. Unity Shader-反射效果(CubeMap,Reflection Probe,Planar Reflection,Screen Space Reflection)
  11. 前沿 | 复活逝者?他在用聊天机器人复制一个自己
  12. CSS实现多行文字两端对齐的效果
  13. elasticsearch 官方文档一个小错误
  14. 计算机科学概论918
  15. Post和Get,Post和Put请求的区别
  16. 虹科分享 | 集中管理的安全USB驱动器的好处
  17. java applet无法运行,错误: 找不到或无法加载主类 sun.applet.AppletViewer
  18. android 免费游戏推荐,10款免费Android小游戏推荐
  19. PLC300寻址指令
  20. 《17.内核的移植1-从三星官方内核开始移植》

热门文章

  1. 使用tensorflow出现 ImportError: DLL load failed: 找不到指定的程序
  2. Linux /dev目录详解
  3. python实现图片文件批处理
  4. 二十万字C/C++、嵌入式软开面试题全集宝典八
  5. [云炬创业基础笔记]第七张创业资源测试15
  6. 科大星云诗社动态20210418
  7. 编译原理之正则表达式
  8. 常规循环引用内存泄漏和Closure内存泄漏
  9. 解析C/C++的预处理指令
  10. 关于前台调用后台事件__doPostBack函数