1215 数组的宽度
题目来源: Javaman
基准时间限制:1 秒 空间限制:131072 KB 分值: 80

收藏
关注

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示例
5
1
2
3
4
5
Output示例
20思路:单调栈;我们只要统计每个数做为最小的数和最大的数所在区间有多少个。这样求当前数作为最大的数左右范围,这个用单调栈维护下,同理最小的也是然后左区间大小乘右区间大小就是这个数作为最大的出现的区间数;
以1 5 4 2 3为例,逐个入栈计算每个数的右边界:
1入栈 => 1
5入栈,前面所有比5小的出栈,并将右边界设为5 => 5 (确定了1的右边界是5,对应下标为1)
4入栈,前面所有比4小的出栈,并将右边界设为4 => 5 4
2入栈,前面所有比2小的出栈,并将右边界设为2 => 5 4 2
3入栈,前面所有比3小的出栈,并将右边界设为3 => 5 4 3(确定了2的右边界是3,对应下标为4)
最后所有数出栈,将5 4 3这3个数的右边界的下标设为5。
 
这样可以确认,每个数字最多进一次栈出一次栈,所有复杂度是O(n)的。
  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<string.h>
  5 #include<math.h>
  6 #include<stack>
  7 #include<set>
  8 #include<queue>
  9 using namespace std;
 10 typedef long long LL;
 11 typedef struct node
 12 {
 13         int x;
 14         int id;
 15 } ss;
 16 LL ans[60000];
 17 int ll[60000];
 18 int rr[60000];
 19 stack<ss>stcx;
 20 int main(void)
 21 {
 22         int n,m;
 23         while(scanf("%d",&n)!=EOF)
 24         {
 25                 int i,j;
 26                 LL sum = 0;
 27                 for(i = 1; i <= n; i++)
 28                 {
 29                         scanf("%lld",&ans[i]);
 30                 }
 31                 while(!stcx.empty())
 32                         stcx.pop();
 33                 for(i = 1; i  <= n; i++)
 34                 {
 35                         while(!stcx.empty())
 36                         {
 37                                 ss ad = stcx.top();
 38                                 if(ad.x >= ans[i])
 39                                 {
 40                                         ss ak;
 41                                         ll[i] = ad.id+1;
 42                                         ak.id = i;
 43                                         ak.x = ans[i];
 44                                         stcx.push(ak);
 45                                         break;
 46                                 }
 47                                 else
 48                                 {
 49                                         stcx.pop();
 50                                         rr[ad.id] = i-1;
 51                                 }
 52                         }
 53                         if(stcx.empty())
 54                         {
 55                                 ll[i] = 1;
 56                                 ss ak;
 57                                 ak.x = ans[i];
 58                                 ak.id = i;
 59                                 stcx.push(ak);
 60                         }
 61                 }
 62                 while(!stcx.empty())
 63                 {
 64                         ss ak = stcx.top();
 65                         stcx.pop();
 66                         rr[ak.id] = n;
 67                         //printf("1\n");
 68                 }
 69
 70                 for(i = 1; i <= n; i++)
 71                 {
 72                         sum+=ans[i]*((rr[i]-i+1)*(i-ll[i]+1));
 73                 }
 74                      for(i = 1; i  <= n; i++)
 75                 {
 76                         while(!stcx.empty())
 77                         {
 78                                 ss ad = stcx.top();
 79                                 if(ad.x <=  ans[i])
 80                                 {
 81                                         ss ak;
 82                                         ll[i] = ad.id+1;
 83                                         ak.id = i;
 84                                         ak.x = ans[i];
 85                                         stcx.push(ak);
 86                                         break;
 87                                 }
 88                                 else
 89                                 {
 90                                         stcx.pop();
 91                                         rr[ad.id] = i-1;
 92                                 }
 93                         }
 94                         if(stcx.empty())
 95                         {
 96                                 ll[i] = 1;
 97                                 ss ak;
 98                                 ak.x = ans[i];
 99                                 ak.id = i;
100                                 stcx.push(ak);
101                         }
102                 }
103                 while(!stcx.empty())
104                 {
105                         ss ak = stcx.top();
106                         stcx.pop();
107                         rr[ak.id] = n;
108                 }
109                    for(i = 1; i <= n; i++)
110                 {
111                         sum-=ans[i]*((rr[i]-i+1)*(i-ll[i]+1));
112                 }
113                 printf("%lld\n",sum);
114         }
115         return 0;
116 }

转载于:https://www.cnblogs.com/zzuli2sjy/p/5930716.html

1215 数组的宽度相关推荐

  1. 51nod 1215 数组的宽度

    N个整数组成的数组,定义子数组a[i]..a[j]的宽度为:max(a[i]..a[j]) - min(a[i]..a[j]),求所有子数组的宽度和.   Input 第1行:1个数N,表示数组的长度 ...

  2. 【51Nod - 1215 】数组的宽度 (单调栈 或 分治 或 单调队列,算贡献,需去重)

    题干: N个整数组成的数组,定义子数组aii..ajj的宽度为:max(ai..aj) - min(ai..aj),求所有子数组的宽度和. Input 第1行:1个数N,表示数组的长度.(1 < ...

  3. Numpy入门教程:03.数组操作

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...

  4. 9.IDA-重新设置函数类型、创建数组结构

    1.重新设置函数类型 写一个简单的代码做测试: [cpp] view plaincopy int fun(int a, double b) { return 0; } int _tmain(int a ...

  5. 卷积过滤器的宽度_卷积神经网络简析

    卷积是一种数学运算,它采用某种方式将一个函数"应用"到另一个函数.结果可以理解为两个函数的"混合体".卷积由一个星号 (*) 表示,这可能与许多编程语言中通常用 ...

  6. 迷宫寻宝(宽度搜索)(C++)

    迷宫寻宝 题目 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,不限时间和步数,当然也没有陷阱,请你判断他能不能顺利的得到宝藏. 输入 多组输入 每组测试数据的第一行包含了两个整数M ...

  7. java 二维矩阵_Java如何输入二维矩阵并存储到二维数组中

    展开全部 最不严谨的写法(但是可62616964757a686964616fe59b9ee7ad9431333335326163用)下列方法可以不需知道二维数组的宽度和长度,但是不能直接保存,而是输入 ...

  8. numpy 数组 ::_看起来不错,没有麻烦:使用NumPy进行数组编程

    numpy 数组 :: It is sometimes said that Python, compared to low-level languages such as C++, improves ...

  9. 透视投影变换-Perspective Transformation

    文章目录 1透视投影变换概述 2透视投影变换原理 3透视投影变换的实现 1透视投影变换概述 透视投影变换(Perspective Transformation)是对图像做视平面(Viewing Pla ...

最新文章

  1. js调试工具console详解
  2. 5.6 matlab曲线拟合案例(股票预测问题、算法的参数优化问题)
  3. ios开发ocr识别_车牌识别技术
  4. 全球及中国农业保险市场营销状况与运营价值分析报告2022版
  5. 通过jquery进行ajax的一些“异常”请求的页面自提交到其它页面
  6. Ibatis中SqlMapClientTemplate和SqlMapClient的区别
  7. Nested组件,解决Flutter布局嵌套过深的利器
  8. “阿里灵杰”问天引擎电商搜索算法赛 - 数据说明2022
  9. 基于CCII+的电流模式二阶带通滤波器仿真
  10. oracle odac安装图解,Oracle数据访问组件ODAC的安装方法
  11. QtcpSocket readyRead 粘包解法
  12. 面对台风“烟花”,旅行延误会如何赔付?
  13. 推荐6款UI设计师必备Sketch插件
  14. 欧普LED灯维修记录及原理解密
  15. 计算机的顶会有哪些?
  16. 编程高效学习方法(费曼学习法)
  17. 弘辽科技:宝妈开淘宝网店,要不要注册公司才能做电商呢?
  18. 增长率相关速算法原理推导
  19. 程序员的数学书籍(C C++篇)
  20. Spring boot 配置文件yml的用法

热门文章

  1. 转 测试linux中expect的timeout参数的作用
  2. 畅游互联的API接口如何对接到自己的网站上?
  3. uuntu中ant的解压安装
  4. Jest中Mock网络请求
  5. java和硬件交互_Java内存模型
  6. 大数据与大量数据处理_我们如何处理和使用如此大量的数据?
  7. 哪种编程语言好找工作_哪种编程语言可以工作? 为了周末?
  8. 医疗项目 开源_医疗保健受开源影响最大的行业之一
  9. 温度传感器硬件编号_打开硬件传感器BITalino进行酷项目
  10. openstack_Facebook的WebScaleSQL,思科投资OpenStack等