算法学习之单调栈

发射站

题目描述

某地有 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;
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 22:18:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 22:18:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 22:18:01       82 阅读
  4. Python语言-面向对象

    2024-04-27 22:18:01       91 阅读

热门阅读

  1. python实现的循环双向链表

    2024-04-27 22:18:01       34 阅读
  2. React 之 组件模块依赖

    2024-04-27 22:18:01       30 阅读
  3. QT案例 使用QProcess调用Aria2.exe下载网络资源文件

    2024-04-27 22:18:01       30 阅读
  4. js实现字符串转json对象的四种方法

    2024-04-27 22:18:01       37 阅读
  5. git使用技巧记录

    2024-04-27 22:18:01       30 阅读
  6. git clone 报错 记录

    2024-04-27 22:18:01       34 阅读
  7. Swift字符串

    2024-04-27 22:18:01       33 阅读
  8. Mysql常用语句

    2024-04-27 22:18:01       34 阅读