洛谷P1901发射站
2024-10-21 06:47:17
一道单调栈裸题,主要是用单调栈维护单调性,和单调队列都可以在\(O(n)\)的时间内得出单调最大值或最小值,要比堆要快。
这个题可以用h来当做单调栈的使用对象,即用单调栈来维护高度,高度是越在栈深处越大,元素下标是越在栈深处越小。
\(Code\):
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <stack>
#define N 1100001
using namespace std;
struct da {
int H, V, MAXN;//H,V分别代表本身的高度,MAXN代表以i这个发射站所得到的最大值。
} stac[N];
int n, maxn, top, now;
int main()
{
scanf("%d", &n);
for (int i = 1, h, v; i <= n; i++)
{
scanf("%d%d", &h, &v);now = 0;
while (top && stac[top].H < h)//寻找第一个大于等于h的栈内元素.而且不仅要将小于h的栈内元素出栈 ,而且还要把这第一个元素出栈,因为该元素已经不可以在向右发挥作用了,且右边的发射站也肯定不会向左给该元素发挥作用了,那它就没用了。
now += stac[top--].V;
if (stac[top].H > h)
stac[top].MAXN += v;
stac[++top].H = h, stac[top].V = v, stac[top].MAXN = now;
if (top == 1)
maxn = max(maxn, stac[top].MAXN);
else//因为top元素和top-1元素在此次循环中都增加了,但不知道那个大,所以要判断。
maxn = max(maxn, max(stac[top].MAXN, stac[top - 1].MAXN));
}
printf("%d", maxn);
}
最新文章
- Apache的dbutils的架构图
- C#在二维码中添加圆角logo
- Ajax load html page
- .net(全局文件,错误页,静态页,IIS配置及防黑)
- 高逼格的实现WiFi共享,不安装第三方wifi共享软件,两种方式实现开启wifi的功能
- VC连接SQL server2005
- 基于visual Studio2013解决C语言竞赛题之1061最大值和次最大值
- python 调用图灵机器人api实现简单的人机交互
- ASP.NET网站单独
- Java学习笔记之类和对象
- OpenStack运维(一):OpenStack项目和用户
- LANMP系列教程之MySQL编译安装CentOS7环境
- cmseasy CmsEasy_5.6_20151009 无限制报错注入(parse_str()的坑)
- 并发库应用之十 &; 多线程数据交换Exchanger应用
- 关于Kafka配额的讨论(2)
- RDLC报表系列--------初级报表
- SAP WM 有无保存WM Level历史库存的Table?
- layui记录
- JAVA中Integer的==和equals注意
- 计算正多边形的面积 Gym - 101840G