算法学习之单调栈

embedded/2024/9/23 14:29:50/

发射站

题目描述

某地有 N N N 个能量发射站排成一行,每个发射站 i i i 都有不相同的高度 H i H_i Hi,并能向两边(两端的发射站只能向一边)同时发射能量值为 V i V_i Vi 的能量,发出的能量只被两边最近的且比它高的发射站接收。显然,每个发射站发来的能量有可能被 0 0 0 1 1 1 2 2 2 个其他发射站所接受。

请计算出接收最多能量的发射站接收的能量是多少。

输入格式

1 1 1 行一个整数 N N N

2 2 2 N + 1 N+1 N+1 行,第 i + 1 i+1 i+1 行有两个整数 H i H_i Hi V i V_i Vi,表示第 i i i 个发射站的高度和发射的能量值。

输出格式

输出仅一行,表示接收最多能量的发射站接收到的能量值。答案不超过 32 位带符号整数的表示范围。

样例 #1

样例输入 #1

3
4 2 
3 5 
6 10

样例输出 #1

7

提示

对于 40 % 40\% 40% 的数据, 1 ≤ N ≤ 5000 , 1 ≤ H i ≤ 1 0 5 , 1 ≤ V i ≤ 1 0 4 1\le N\le 5000,1\le H_i\le 10^5,1\le V_i\le 10^4 1N5000,1Hi105,1Vi104

对于 70 % 70\% 70% 的数据, 1 ≤ N ≤ 1 0 5 , 1 ≤ H i ≤ 2 × 1 0 9 , 1 ≤ V i ≤ 1 0 4 1\le N\le 10^5,1\le H_i\le 2\times 10^9,1\le V_i\le 10^4 1N105,1Hi2×109,1Vi104

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 6 , 1 ≤ H i ≤ 2 × 1 0 9 , 1 ≤ V i ≤ 1 0 4 1\le N\le 10^6,1\le H_i\le 2\times 10^9,1\le V_i\le 10^4 1N106,1Hi2×109,1Vi104

我们正常的思路就是直接模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int N = 1e+6 + 5;
int n;
ll h[N];
int v[N];
int ans[N];int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> h[i] >> v[i];}h[0] = h[n+1] = 2000000000;for (int i = 1;i<=n; i++) {for (int j = i - 1; j > 0; j--) {if (h[j] > h[i]) {ans[j] += v[i];break;}}for (int j = i + 1; j <= n; j++) {if (h[j] > h[i]) {ans[j] += v[i];break;}}}int pp = 0;for (int i = 1; i <= n; i++) {pp = max(ans[i], pp);}cout << pp;return 0;
}

在这里插入图片描述
超时了两个点
在这里插入图片描述
我们需要维护一个单调栈

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int N = 1e+6 + 5;
int n;
ll h[N];
int v[N];
int ans[N];
int q[N];int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> h[i] >> v[i];}int top = 0; // 这是一个栈顶的for (int i = 1; i <= n; i++) {while (top && h[q[top]] < h[i]) // 出栈操作,这个必须保证里面有东西,且栈顶的是最小的, 如果进来的大于栈顶的,那么这个就要出栈{ans[i] += v[q[top--]];}// 进栈操作q[++top] = i;ans[q[top - 1]] += v[i];       // 给最近一个高的加上去}int pp = 0;for (int i = 1; i <= n; i++) {pp = max(pp, ans[i]);}cout << pp;return 0;
}

http://www.ppmy.cn/embedded/19692.html

相关文章

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

iOS AVPlayer

参考文章 AVPlayer的基本使用

【VUE】解决 Element UI 中 el-tab 切换时 ECharts 渲染宽度问题

解决 Element UI 中 el-tab 切换时 ECharts 渲染宽度问题 在使用 Element UI 的 el-tabs 组件时&#xff0c;我们常常会遇到一个问题&#xff1a;当 ECharts 图表被放在非当前激活的 Tab 内时&#xff0c;图表无法正确渲染其宽度和高度。由于在 Tab 未激活状态下&#xff0c;图…

李沐65_注意力分数——自学笔记

Additive Attention 等价于将key和value合并起来后放入到一个隐藏大小为h输出大小为1的单隐藏层 总结 1.注意力分数是query和key的相似度&#xff0c;注意力权重是分数的softmax结果 2.两种常见的分数计算: &#xff08;1&#xff09;将query和key合并起来进入一个单输出单…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

探索树与二叉树:从基础到应用的完整指南

目录 一.树的基本概念 二.二叉树的概念 三.二叉树的遍历和线索二叉树 四.树和森林 五.树与二叉树的应用 六.实际案例 七.总结 一.树的基本概念 树是一种非线性的数据结构&#xff0c;由节点和边组成的有限集合。树的结构类似于自然界中的树&#xff0c;从根部开始&#xff…

python Django中管理用户权限内置用户认证系统用户模型(User)、权限模型(Permission)和组模型(Group)

在Django中管理用户权限通常涉及到Django的内置用户认证系统&#xff0c;该系统提供了用户模型&#xff08;User&#xff09;、权限模型&#xff08;Permission&#xff09;和组模型&#xff08;Group&#xff09;。下面是如何使用Django来管理用户权限的基本步骤&#xff1a; …

Windows安装Elasticsearch 7.9.2

1 下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-windows-x86_64.zip 2 配置 进入config目录&#xff0c;打开elasticsearch.yml文件&#xff0c;给集群和节点配置名称。 cluster.name: my-es node.name: node-1 3 启动 打开bin目录&am…