牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟

  • 题意
  • 思路
  • Code

传送门: https://ac.nowcoder.com/acm/contest/16081/E

题意

  • 登山顺序不一定从左到右,是按照给出山峰的顺序登山顺序不一定从左到右,是按照给出山峰的顺序登山顺序不一定从左到右,是按照给出山峰的顺序
  • 找到左边第一个大于当前山峰的山峰的坐标,修改它找到左边第一个大于当前山峰的山峰的坐标,修改它找到左边第一个大于当前山峰的山峰的坐标,修改它
  • 如果右边没有大于当前山峰的,找到离当前山峰最近的最矮山峰,修改它如果右边没有大于当前山峰的,找到离当前山峰最近的最矮山峰,修改它如果右边没有大于当前山峰的,找到离当前山峰最近的最矮山峰,修改它

思路

首先顺序是按照给出的山峰顺序,并且x坐标过大,但是点数只有2e5,所以需要离散化。首先顺序是按照给出的山峰顺序,并且x坐标过大,但是点数只有2e5,所以需要离散化。首先顺序是按照给出的山峰顺序,并且x坐标过大,但是点数只有2e5,所以需要离散化。

对于一个点,需要找到左边和右边两个特殊要求的山峰,这个过程可以二分。对于一个点,需要找到左边和右边两个特殊要求的山峰,这个过程可以二分。对于一个点,需要找到左边和右边两个特殊要求的山峰,这个过程可以二分。
并且是区间查询,所以需要线段树维护,维护区间最大值和最小值即可。并且是区间查询,所以需要线段树维护,维护区间最大值和最小值即可。并且是区间查询,所以需要线段树维护,维护区间最大值和最小值即可。

  • 左边:假设当前是第i座山,映射过去的位置是pos(离散化),二分[1,pos]区间,找到最近的一个大于当前高度的山左边:假设当前是第i座山,映射过去的位置是pos(离散化),二分[1,pos]区间,找到最近的一个大于当前高度的山左边:假设当前是第i座山,映射过去的位置是pos(离散化),二分[1,pos]区间,找到最近的一个大于当前高度的山
  • 右边:同理。假设映射的位置是pos,先求出区间[pos+1,n]的最大值判断需不需要修改。若是需要,则二分[pos+1,n]区间,找到最近的一个最小值右边:同理。假设映射的位置是pos,先求出区间[pos+1,n]的最大值判断需不需要修改。若是需要,则二分[pos+1,n] 区间,找到最近的一个最小值右边:同理。假设映射的位置是pos,先求出区间[pos+1,n]的最大值判断需不需要修改。若是需要,则二分[pos+1,n]区间,找到最近的一个最小值

Code

#include "bits/stdc++.h"
using namespace std;const int N = 2e5 + 10;struct node {int x, h;
}a[N];
int b[N], h[N], idx[N];#define lc u << 1
#define rc u << 1 | 1
#define mid (t[u].l + t[u].r) / 2struct Tree {int l, r;int mx, mn;
}t[N << 2];inline void push_up(int u) {t[u].mx = max(t[lc].mx, t[rc].mx);t[u].mn = min(t[lc].mn, t[rc].mn);
}void build(int u, int l, int r) {t[u].l = l; t[u].r = r;if(l == r) {t[u].mx = t[u].mn = h[l];return ;}int m = (l + r) / 2;build(lc, l, m);build(rc, m + 1, r);push_up(u);
}void modify(int u, int p, int v) {if(t[u].l == t[u].r) {t[u].mn = t[u].mx = v;return ;}if(p <= mid) modify(lc, p, v);else modify(rc, p, v);push_up(u);
}int query_max(int u, int ql, int qr) {if(ql <= t[u].l && t[u].r <= qr) return t[u].mx;int mx = -1e9 - 7;if(ql <= mid) mx = max(mx, query_max(lc, ql, qr));if(qr > mid)  mx = max(mx, query_max(rc, ql, qr));return mx;
}int query_min(int u, int ql, int qr) {if(ql <= t[u].l && t[u].r <= qr) return t[u].mn;int mn = 1e9 + 7;if(ql <= mid) mn = min(mn, query_min(lc, ql, qr));if(qr > mid)  mn = min(mn, query_min(rc, ql, qr));return mn;
}void solve() {int n; cin >> n;for(int i = 1;i <= n; i++) {cin >> a[i].x >> a[i].h;b[i] = a[i].x;}sort(b + 1, b + n + 1);for(int i = 1;i <= n; i++) {idx[i] = lower_bound(b + 1, b + n + 1, a[i].x) - b;h[idx[i]] = a[i].h;}build(1, 1, n);for(int i = 1;i <= n; i++) {int pos = idx[i];/*------查找左边1-pos--------*/int lx = query_max(1, 1, pos);if(lx > h[pos]) {int l = 1, r = pos, ans = 0;while(l <= r) {int m = (l + r) / 2;lx = query_max(1, m, pos);if(lx > h[pos]) ans = m, l = m + 1;else r = m - 1;}h[ans] = h[pos]; modify(1, ans, h[pos]);}if(pos == n) continue;/*---------查找右边pos+1-n-----------*/int rx = query_max(1, pos + 1, n);if(rx <= h[pos]) {rx = query_min(1, pos + 1, n);int l = pos + 1, r = n, ans = 0;while(l <= r) {int m = (l + r) / 2;int nrx = query_min(1, pos + 1, m);if(nrx == rx) ans = m, r = m - 1;else l = m + 1;}h[ans] = h[pos]; modify(1, ans, h[pos]);}}for(int i = 1;i <= n; i++) cout << h[idx[i]] << " ";cout << endl;
}signed main() {solve();
}

牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟相关推荐

  1. 牛客小白月赛28—E会当凌绝顶,一览众山小(线段树)

    链接:https://ac.nowcoder.com/acm/contest/7412/E 来源:牛客网 题目描述 牛牛最喜欢爬山了,他喜欢站在最高的山峰上展望. 牛牛来到山脚下,看到这里一共有 n ...

  2. 牛客小白月赛28 J.树上行走

    牛客小白月赛28 J.树上行走 题目链接 题目描述 牛牛苦练武功绝学--轻功水上漂,最终没有练成,但是他学会了在树上行走的本领. 这天,牛牛落入了敌人的陷阱,身后有巨石追击,面前有n个点,n-1条边连 ...

  3. 牛客小白月赛28 D.位运算之谜

    牛客小白月赛28 D.位运算之谜 题目链接 题目描述 a+ba + ba+b 的值为 xxx,a&ba\&ba&b 的值为 yyy,首先需要判断能否有一组 a,ba,ba,b ...

  4. 牛客小白月赛28 B.牛牛和牛可乐的赌约2

    牛客小白月赛28 B.牛牛和牛可乐的赌约2 题目链接 题目描述 牛牛感觉在上一次赌约中,情况对于自己非常不利,所以决定再赌一场. 这时候,牛蜓队长出现了:第一,绝对不意气用事:第二,绝对不漏判任何一件 ...

  5. 牛客小白月赛28 G.牛牛和字符串的日常

    牛客小白月赛28 G.牛牛和字符串的日常 题目链接 题目描述 牛牛每天都要做的事就是读书,从书里找自己喜欢的句子,他每天都会去读一本书,如果牛牛今天读的书的某连续 k k k 个字符刚好是牛牛喜欢句子 ...

  6. 牛客小白月赛28 A牛牛和牛可乐的赌约 (数论-费马小定理)

    题目 A牛牛和牛可乐的赌约 题目链接 传送门 题解 注意阅读题目是计算牛牛输的概率. 需要掌握的知识点 快速幂 费马小定理 分数取模 首先我们容易知道 牛牛 赢的概率是 1 n m \frac{1}{ ...

  7. 牛客小白月赛28 C-单词记忆方法——dfs

    单词记忆方法 题目描述 牛牛考完了四六级,准备分享一下自己的英语学习方法. 牛牛:学习英语最重要的就是背单词,如果你能把所有的单词都记住,那么你的英语就能变成天下第一. 然而牛牛的记忆方法就是把单词的 ...

  8. 牛客小白月赛6 J.洋灰三角

    牛客小白月赛6 J.洋灰三角 题目链接 题目描述 洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土. WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个 ...

  9. 牛客小白月赛16 小石的签到题(博弈)

    牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...

最新文章

  1. Channel Allocation HDU1373
  2. 如何使用阿里云ARMS轻松重现用户浏览器问题
  3. JimuReport积木报表与JeecgBoot集成文档—开源免费的报表工具!
  4. Enterprise Solution 解决方案与源代码下载
  5. PTA:6-8 数组元素的区间删除 (20 分)
  6. 处理word 多级标题编号不联动的问题
  7. 初中毕业也能月薪过万!5个质量极高的教程网站,免费献给你
  8. 《丑奴儿书博山道中壁》
  9. 智工教育:一消《技术实务》知识点整理
  10. 字符集和Java char与UTF-16
  11. JVM(1)——字节码
  12. android开发中绕过检测,[原创] 某加固软件的一些检测点以及绕过方法,欢迎补充...
  13. Tensorflow slim库
  14. Hdu 5873 2016 ACM/ICPC Asia Regional Dalian Online 1006(兰道定理)
  15. 改成每天晚上锻炼身体
  16. C++查看变量类型办法(typeinfo)
  17. signature=b0de5b058018aa87bad0e19868c78dad,来用百度密语吧!!!
  18. Java之父:C语言是撑起一切的基石
  19. JS获取JSON字符串的几种方式
  20. Keepalived负载均衡

热门文章

  1. 2D游戏案例:Unity答题系统(MySQL版)
  2. 华硕 RT-N13U 刷机研究资料
  3. python中len和range函数_Python中len()和range()函数
  4. 随想录二刷Day15——二叉树
  5. 可达编程 星际蛋糕 (Intercastellar)
  6. uniapp带视频背景的登录页面
  7. MySQL NOW() 是否包含夏令时
  8. 淘宝IP地址库获取到省市IP地址
  9. bt分析之bt种子发布---做种(2)
  10. 【JoJo的摄影笔记】相机配件之奥义——风林火山