牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟
牛客小白月赛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-会当凌绝顶,一览众山小 线段树+二分暴力模拟相关推荐
- 牛客小白月赛28—E会当凌绝顶,一览众山小(线段树)
链接:https://ac.nowcoder.com/acm/contest/7412/E 来源:牛客网 题目描述 牛牛最喜欢爬山了,他喜欢站在最高的山峰上展望. 牛牛来到山脚下,看到这里一共有 n ...
- 牛客小白月赛28 J.树上行走
牛客小白月赛28 J.树上行走 题目链接 题目描述 牛牛苦练武功绝学--轻功水上漂,最终没有练成,但是他学会了在树上行走的本领. 这天,牛牛落入了敌人的陷阱,身后有巨石追击,面前有n个点,n-1条边连 ...
- 牛客小白月赛28 D.位运算之谜
牛客小白月赛28 D.位运算之谜 题目链接 题目描述 a+ba + ba+b 的值为 xxx,a&ba\&ba&b 的值为 yyy,首先需要判断能否有一组 a,ba,ba,b ...
- 牛客小白月赛28 B.牛牛和牛可乐的赌约2
牛客小白月赛28 B.牛牛和牛可乐的赌约2 题目链接 题目描述 牛牛感觉在上一次赌约中,情况对于自己非常不利,所以决定再赌一场. 这时候,牛蜓队长出现了:第一,绝对不意气用事:第二,绝对不漏判任何一件 ...
- 牛客小白月赛28 G.牛牛和字符串的日常
牛客小白月赛28 G.牛牛和字符串的日常 题目链接 题目描述 牛牛每天都要做的事就是读书,从书里找自己喜欢的句子,他每天都会去读一本书,如果牛牛今天读的书的某连续 k k k 个字符刚好是牛牛喜欢句子 ...
- 牛客小白月赛28 A牛牛和牛可乐的赌约 (数论-费马小定理)
题目 A牛牛和牛可乐的赌约 题目链接 传送门 题解 注意阅读题目是计算牛牛输的概率. 需要掌握的知识点 快速幂 费马小定理 分数取模 首先我们容易知道 牛牛 赢的概率是 1 n m \frac{1}{ ...
- 牛客小白月赛28 C-单词记忆方法——dfs
单词记忆方法 题目描述 牛牛考完了四六级,准备分享一下自己的英语学习方法. 牛牛:学习英语最重要的就是背单词,如果你能把所有的单词都记住,那么你的英语就能变成天下第一. 然而牛牛的记忆方法就是把单词的 ...
- 牛客小白月赛6 J.洋灰三角
牛客小白月赛6 J.洋灰三角 题目链接 题目描述 洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土. WHZ有很多铸造成三角形的洋灰块,他想把这些洋灰三角按照一定的规律放到摆成一排的n个 ...
- 牛客小白月赛16 小石的签到题(博弈)
牛客小白月赛16 小石的签到题 链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 题目描述 输入描述: 共一行,输入一个数 nnn . 输出描述: ...
最新文章
- 河北省重大系统征集系统案例分析
- vue 返回滚动条顶部组件_vue中回到顶部
- 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法
- grafana zabbix 模板_Grafana + Zabbix 监控系统搭建
- debian 安装php gd2,如何在Debian Linux中为PHP安装Ioncube
- C++的三种交换数值的方式(值传递、地址传递、引用传递)
- IBM:云存储三步走
- 瑞友天翼应用虚拟化系统V6.0之设备重定向
- win2012没有远程桌面授权服务器可以提供许可证 如何远程
- Windows切换内外网ip
- matlab2014如何获得hostid,hostid.c/获取主机标识
- Sqlserver与Oracle 10g数据类型对照
- php降序怎写,PHP数组如何按键名实现降序排列
- 虚拟机WMware NAT方式共享物理主机IP地址上网设置方式
- 第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组
- NLP词性分析,实体分析,句法树构造(依存句法树分析)
- 【深度长文】老IT公司怎么做到像创业公司一样快
- ABAQUS将背景色改为白色
- 如何让DIV水平和垂直居中
- ❤️汇总贴❤️本科课程汇总(武汉理工大学计算机科学与技术专业)