1215 数组的宽度 单调栈

简介: 1215 数组的宽度 单调栈

N个整数组成的数组,定义子数组a[i]…a[j]的宽度为:max(a[i]…a[j]) - min(a[i]…a[j]),求所有子数组的宽度和。

输入

第1行:1个数N,表示数组的长度。(1 <= N <= 50000)

第2 - N + 1行:每行1个数,表示数组中的元素(1 <= A[i] <= 50000)

输出

输出所有子数组的宽度和。

输入样例

5

1

2

3

4

5

输出样例

20

使用单调栈处理出以a[i]为最小值和最大值的左右边界

答案为:sum : (i - Lmax[i]) * (Rmax[i] - i) * a[i] - (i - Lmin[i]) * (Rmin[i] - i) * a[i]

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
int Lmin[maxn], Rmin[maxn];
int Lmax[maxn], Rmax[maxn];
stack<int> s;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  a[0] = 0; a[n + 1] = 0;
  for (int i = 1; i <= n + 1; i++) {
    while (!s.empty() && a[s.top()] >= a[i]) {
      Rmin[s.top()] = i;
      s.pop();
    }
    s.push(i);
  }
  while (!s.empty()) s.pop();
  for (int i = n; i >= 0; i--) {
    while (!s.empty() && a[s.top()] > a[i]) {
      Lmin[s.top()] = i;
      s.pop();
    }
    s.push(i);
  }
  a[0] = 1e9; a[n + 1] = 1e9;
  while (!s.empty()) s.pop();
  for (int i = 1; i <= n + 1; i++) {
    while (!s.empty() && a[s.top()] <= a[i]) {
      Rmax[s.top()] = i;
      s.pop();
    }
    s.push(i);
  }
  while (!s.empty()) s.pop();
  for (int i = n; i >= 0; i--) {
    while (!s.empty() && a[s.top()] < a[i]) {
      Lmax[s.top()] = i;
      s.pop();
    }
    s.push(i);
  }
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    ans += 1LL * (i - Lmax[i]) * (Rmax[i] - i) * a[i];
    ans -= 1LL * (i - Lmin[i]) * (Rmin[i] - i) * a[i];
  }
  cout << ans << endl;
  return 0;
}
相关文章
|
5天前
|
算法 C语言 C++
【practise】栈的压入和弹出序列
【practise】栈的压入和弹出序列
|
3天前
栈的几个经典应用,真的绝了
文章总结了栈的几个经典应用场景,包括使用两个栈来实现队列的功能以及利用栈进行对称匹配,并通过LeetCode上的题目示例展示了栈在实际问题中的应用。
栈的几个经典应用,真的绝了
|
4天前
|
存储 网络协议 Linux
用户态协议栈06-TCP三次握手
用户态协议栈06-TCP三次握手
|
4天前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
9 0
|
4天前
|
存储 人工智能 运维
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
高质量存储力发展问题之浪潮信息发布的大模型智算软件栈的定义如何解决
8 0
|
5天前
|
设计模式 算法 C语言
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
|
5天前
|
存储 算法 C++
【CPP】栈简介及简化模拟实现
【CPP】栈简介及简化模拟实现
【数据结构】栈和队列
【数据结构】栈和队列
|
5天前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
7天前
|
存储
数据结构——栈(Stack)
栈(Stack)是一种常见且重要的数据结构,它遵循后进先出(Last-In-First-Out, LIFO)的原则,即最后加入的元素会是第一个被移除的。
22 4