数组的宽度
来源:互联网 发布:lte网络优化工程师招聘 编辑:程序博客网 时间:2024/05/16 03:40
N个整数组成的数组,定义子数组a[i]..a[j]的宽度为:max(a[i]..a[j]) - min(a[i]..a[j]),求所有子数组的宽度和。
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000)第2 - N + 1行:每行1个数,表示数组中的元素(1 <= A[i] <= 50000)
Output
输出所有子数组的宽度和。
Input示例
512345
Output示例
20
思路:
用单调递减栈计算每个数作为最大值影响的区间,区间数量乘以这个数的值就是这个数作为最大值的贡献。
同理,用单调递增栈计算每个数作为最小值影响的区间,区间数量乘以这个数的值就是这个数作为最小值的贡献。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int MAXN = 5e5 + 10; int a[MAXN], s[MAXN]; int main() { int n; cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];} a[++n] = 0; ll sum1 = 0, sum2 = 0; int top = 0; for (int i = 1; i <= n; i++) { while (top && a[i] < a[s[top]]) { sum1 += 1ll * (s[top] - s[top - 1]) * (i - s[top]) * a[s[top]]; top--; } s[++top] = i; } a[n] = MAXN; top = 0; for (int i = 1; i <= n; i++) { while (top && a[i] > a[s[top]]) { sum2 += 1ll * (s[top] - s[top - 1]) * (i - s[top]) * a[s[top]]; top--; } s[++top] = i; } cout << sum2 - sum1 << endl; return 0; }
阅读全文
0 0
- 数组的宽度
- 51nod1215数组的宽度(单调栈)
- 51nod 1215 数组的宽度
- 51Nod-1215-数组的宽度
- 51nod1215数组的宽度(单调栈)
- 图的宽度优先搜索(数组实现)
- c++数组宽度计算的sizeof关于指针设想
- 51nod 1215:数组的宽度 单调栈
- 51 Nod 1215 数组的宽度(单调栈)
- 51nod-1215 数组的宽度(单调栈)
- 【单调栈 or 分治】51Nod1215[数组的宽度]题解
- 【分治计数|单调栈】51Nod 1215 数组的宽度
- [分治 || 单调栈 单调队列] 51Nod 1215 数组的宽度
- 关于字符型数组存放宽度问题
- 取得div的宽度
- 常用浏览器的宽度
- 页面的宽度/高度
- 指定宽度的新闻标题
- [BZOJ2816][ZJOI2012]网络-Link Cut Tree
- 【java基础:net】基于多线程的UDP发送和接收的聊天Demonstration
- oracle数据库sql语句知识点总结(精炼版)
- RSA加密解密算法java实现
- iOS开发多线程篇—多线程简单介绍
- 数组的宽度
- 简单的九九乘法表
- #java#如何去掉点击按钮时文字的方框
- iOS开发多线程篇—NSOperation简单介绍
- hibernate框架的查询方式hql的多表查询(二十二)
- 用ES6和fetch封装网络请求
- java语言基础【java分支结构】
- ICPC2017北京现场赛H Puzzle Game
- vue学习-路由