Solution

显然先想到处理出每个点能看到的最高的顶点。

然后考虑模拟题目的过程,一段一段走时间复杂度显然不够优秀。

考虑我们要求什么,我们需要求出\(u\)到\(v\)的最近的一个点,使得这个点能看到的点比\(v\)能看到的点更高。

然后这个东西可以直接线段树,当然也可以二分+st表

复杂度\(O(n\log n)\)

Code

#include <cstdio>
#include <iostream>
#define LL long long
#define RE register
#define IN inline
using namespace std;
IN int read() {
int res = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar());
for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
return res;
}
int n, le[2000010], ri[2000010], nxt[2000010], st[2000010][20], lg[2000010];
LL f[2000010];
struct Point {
int x, y;
}p[2000010];
inline double slope(int x, int y) {return 1.0 * (p[x].y - p[y].y) / (p[x].x - p[y].x);}
inline bool cmp(int x, int y) {
if(x == y) return false;
if(p[x].y > p[y].y) return true;
if(p[x].y == p[y].y) return p[x].x > p[y].x;
return false;
}
int stk[2000010];
inline int pmax(int x, int y) {return cmp(x, y) ? x : y;}
void preWork() {
int top = 0;
for(int i = 1; i <= n; ++i) {
while(top > 1 && slope(stk[top], i) >= slope(stk[top], stk[top - 1])) -- top;
if(top) le[i] = stk[top]; stk[++top] = i;
}
top = 0;
for(int i = n; i; --i) {
while(top > 1 && slope(stk[top], i) <= slope(stk[top], stk[top - 1])) -- top;
if(top) ri[i] = stk[top]; stk[++top] = i;
}
for(int i = 1; i <= n; ++i) {
nxt[i] = pmax(le[i], ri[i]);
if(cmp(i, nxt[i])) nxt[i] = 0;
st[i][0] = nxt[i];
}
for(int i = 1; i <= lg[n]; ++i)
for(int j = 1; j <= n; ++j)
st[j][i] = pmax(st[j][i - 1], st[j + (1 << i - 1)][i - 1]);
return ;
}
inline LL abs(int x) {return x < 0 ? -x : x;}
inline int query(int l, int r) {int len = r - l + 1; return pmax(st[l][lg[len]], st[r - (1 << lg[len]) + 1][lg[len]]);}
LL solve(int k) {
if(f[k] || !nxt[k]) return f[k];
int res = nxt[k];
if(nxt[k] < k) {
for(int l = nxt[k], r = k - 1, mid; l <= r;) {
mid = l + r >> 1;
if(cmp(query(mid, k), nxt[k])) res = mid, l = mid + 1;
else r = mid - 1;
}
}
else {
for(int l = k + 1, r = nxt[k], mid; l <= r;) {
mid = l + r >> 1;
if(cmp(query(k, mid), nxt[k])) res = mid, r = mid - 1;
else l = mid + 1;
}
}
f[k] = solve(res) + abs(res - k);
return f[k];
}
void out(int x) {printf("%d %d\n",p[x].x,p[x].y);}
int main() {
freopen("mountain.in","r",stdin);
freopen("mountain.out","w",stdout);
n = read();
for(int i = 2; i <= n; ++i) lg[i] = lg[i >> 1] + 1;
for(int i = 1; i <= n; ++i) p[i].x = read(), p[i].y = read();
preWork();
for(int i = 1; i <= n; ++i) solve(i);
for(int i = 1; i <= n; ++i) printf("%lld\n",f[i]);
return 0;
}```

GMOJ5673 爬山法 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. mysql开发实战8问

    mysql读写性能是多少,有哪些性能相关的配置参数? Mysql负载高时,如何找到是由哪些SQL引起的? 如何针对具体的SQL做优化? SQL层面已难以优化,请求量继续增大时的应对策略? Mysql如 ...

  2. Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_148 在之前的几篇文章中,介绍了业界中比较火爆的图片技术SVG(Scalable Vector Graphics),比如Iconf ...

  3. JPA作持久层操作

    JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构.虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql的编写,但别忘了需要 ...

  4. 【原创】Python 使用jmpy模块加密|加固 python代码

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 使用jmpy模块 将py文件加密为so或 ...

  5. 参考MySQL Internals手册,使用Golang写一个简单解析binlog的程序

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL作为最流行的开源关系型数据库,有大量的拥趸.其生态已经相当完善,各项特性在圈内都有大量研究.每次新特性发布,都会 ...

  6. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  7. 面试突击73:IoC 和 DI 有什么区别?

    IoC 和 DI 都是 Spring 框架中的重要概念,就像玫瑰花与爱情一样,IoC 和 DI 通常情况下也是成对出现的.那 IoC 和 DI 什么关系和区别呢?接下来,我们一起来看. 1.IoC 介 ...

  8. 元数据治理利器 - Apache Atlas

    一.功能简介 Atlas 是一组可扩展的核心基础治理服务,使企业能够高效地满足其在 Hadoop 中的合规性要求,并允许与整个企业数据生态系统集成.Apache Atlas 为组织提供开放的元数据管理 ...

  9. 如何自定义一个Collector

    Collectors类提供了很多方便的方法,假如现有的实现不能满足需求,我们如何自定义一个Collector呢?   Collector接口提供了一个of方法,调用该方法就可以实现定制Collecto ...

  10. Linux应急响应学习

    Linux应急响应-系统日志排查-溯源 溯源 找到攻击者.系统日志分析攻击者的ip  攻击者可能留下了一些代码 样本 网上的信息很大程度上是不可信的. 方法: 蜜罐  高交互的蜜罐 溯源: ip 日志 ...