当前位置: 首页 > news >正文

维护左右边第一个小的值(滑动窗口)

前言:这个题目和我之前写的一个题目差不多,我们可以维护左右边第一个小的,然后我们就可以快速枚举


题目地址
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define ll long longconst int N = (int)1e6 + 10;
int a[N], h[N];
int qian[N];
int n;
int lef[N], rig[N]; // 记录左边和右边第一个小于这个数的坐标void fun() {deque<int> q;for (int i = 1; i <= n; i++) {int u = h[i];while (q.size() && h[q.back()] > u) {int v = q.back();q.pop_back();rig[v] = i;}q.push_back(i);}while (q.size()) {int u = q.back(); q.pop_back();rig[u] = n + 1;}
}void fun1() {deque<int> q;for (int i = n; i; i--) {int u = h[i];while (q.size() && h[q.back()] > u) {int v = q.back();q.back();lef[v] = i;}q.push_back(i);}while (q.size()) {int u = q.back(); q.pop_back();lef[u] = 0;}
}signed main() {cin >> n;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);qian[i] = qian[i - 1] + a[i];}for (int i = 1; i <= n; i++) {scanf("%d", &h[i]);}fun(); fun1();int ans = 0;for (int i = 1; i <= n; i++) {int hi = h[i];int len = qian[rig[i] - 1] - qian[lef[i]];ans = max(ans, hi * len);}cout << ans;return 0;
}

http://www.mrgr.cn/news/25533.html

相关文章:

  • 多态的概念
  • 终端文件管理神器 !!!【送源码】
  • Keras中MinMaxNorm约束的具体计算逻辑和方法解密
  • mysql学习教程,从入门到精通,SQL AND OR 运算符(12)
  • 【C++ Primer Plus习题】15.4
  • 二叉树--
  • 【阿一网络安全】如何让你的密码更安全?(三) - 散列函数
  • Linux系统:chgrp命令
  • 大二上学期详细学习计划
  • 表观遗传系列1:DNA 甲基化以及组蛋白修饰
  • 爬虫
  • 再谈c++模板
  • VRAY云渲染动画怎么都是图片?
  • 9月12日的学习
  • Python中如何实现列表的排序
  • strcpy 函数及其缺点
  • 【F的领地】项目拆解:小学教辅资料
  • javascript如何打印九九乘法表
  • Leetcode面试经典150题-82.删除排序链表中的重复元素II
  • 59 - I. 滑动窗口的最大值