Feel Good

题意:给你一个非负整数数组,定义某个区间的参考值为:区间所有元素的和*区间最小元素。求该数组中的最大参考值以及对应的区间。
比如说有6个数3 1 6 4 5 2
最大参考值为6,4,5组成的区间,区间最小值为4,参考值为4*(6+5+4)=60
数据范围1<=n<=100000;
单调栈做法:对于一个区间,我们需要知道区间的最小值,并且是在出栈的时候更新最优解;这时就可以想到当我们维护的是一个单调递增的栈时,栈顶元素由于当前入栈的元素逼栈顶元素小而要出栈时,这个栈顶元素所代表的区间的l,r分别是什么?很明显,为栈顶元素出栈后,当前元素未入栈之间的空区域**,并且未出栈的栈顶元素值就是该区间的最小值;

注意:为了使得最后栈中没有元素,要在最后加上一个最小的元素-1;并且由于ans 可能等于0,所以初始化为-1,否则当数据为 1 0时,由于ansl,ansr没有初始化,并且在更新ans时使用的是tmp > ans,导致区间边界为一随机值,而导致WA.另外注意sum会爆int即可;

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string.h>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<cmath>
  8. #include<stdlib.h>
  9. #include<time.h>
  10. #include<stack>
  11. #include<set>
  12. #include<map>
  13. #include<queue>
  14. using namespace std;
  15. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  16. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  17. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  18. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  19. #define MS0(a) memset(a,0,sizeof(a))
  20. #define MS1(a) memset(a,-1,sizeof(a))
  21. #define MSi(a) memset(a,0x3f,sizeof(a))
  22. #define inf 0x3f3f3f3f
  23. #define lson l, m, rt << 1
  24. #define rson m+1, r, rt << 1|1
  25. typedef pair<int,int> PII;
  26. #define A first
  27. #define B second
  28. #define MK make_pair
  29. typedef __int64 ll;
  30. template<typename T>
  31. void read1(T &m)
  32. {
  33. T x=,f=;char ch=getchar();
  34. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  35. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  36. m = x*f;
  37. }
  38. template<typename T>
  39. void read2(T &a,T &b){read1(a);read1(b);}
  40. template<typename T>
  41. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  42. template<typename T>
  43. void out(T a)
  44. {
  45. if(a>) out(a/);
  46. putchar(a%+'');
  47. }
  48. const int N = ;
  49. int a[N],stk[N];// stk[]存储的是标号 不是直接的值
  50. ll sum[N],ans = -;
  51. int main()
  52. {
  53. int p = ,ansl,ansr,n;
  54. read1(n);
  55. rep1(i,,n){
  56. read1(a[i]);
  57. sum[i] += sum[i-] + a[i];
  58. }
  59. a[++n] = -;stk[] = ;// 维护一个单调递增的栈
  60. rep1(i,,n){
  61. while(p && a[i] < a[stk[p]]){
  62. int l = stk[p-];// [l+1,i-1]最小值为a[stk[p]]
  63. ll tmp = 1LL*a[stk[p]]*(sum[i-] - sum[l]);
  64. if(tmp > ans)
  65. ans = tmp,ansl = l+,ansr = i-;
  66. p--;
  67. }
  68. stk[++p] = i;
  69. }
  70. printf("%I64d\n%d %d\n",ans,ansl,ansr);
  71. return ;
  72. }

poj 2796 Feel Good 单调栈区间问题的更多相关文章

  1. poj 2796 Feel Good单调栈

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20408   Accepted: 5632 Case T ...

  2. TZOJ 4244 Sum(单调栈区间极差)

    描述 Given a sequence, we define the seqence's value equals the difference between the largest element ...

  3. POJ - 2796 Feel Good 单调递增栈+前缀和

    Feel Good Bill is developing a new mathematical theory for human emotions. His recent investigations ...

  4. poj 2796 Feel Good 单调队列

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8753   Accepted: 2367 Case Ti ...

  5. [poj 2796]单调栈

    题目链接:http://poj.org/problem?id=2796 单调栈可以O(n)得到以每个位置为最小值,向左右最多扩展到哪里. #include<cstdio> #include ...

  6. POJ 2796:Feel Good(单调栈)

    http://poj.org/problem?id=2796 题意:给出n个数,问一个区间里面最小的元素*这个区间元素的和的最大值是多少. 思路:只想到了O(n^2)的做法. 参考了http://ww ...

  7. POJ 2796 Feel Good 【单调栈】

    传送门:http://poj.org/problem?id=2796 题意:给你一串数字,需要你求出(某个子区间乘以这段区间中的最小值)所得到的最大值 例子: 6 3 1 6 4 5 2 当L=3,R ...

  8. Poj 2796 单调栈

    关于单调栈的性质,和单调队列基本相同,只不过单调栈只使用数组的尾部, 类似于栈. Accepted Code: /******************************************* ...

  9. POJ 2796 Feel Good(单调栈)

    传送门 Description Bill is developing a new mathematical theory for human emotions. His recent investig ...

随机推荐

  1. Android Studio编译FBReaderJ

    我的个人环境 系统:mac (windows应该差不多) 工具:android studio 2.1.2 注意:一定要安装NDK!一定要安装NDK!一定要安装NDK!     如何安装NDK     ...

  2. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

  3. Nim游戏(组合游戏Combinatorial Games)

    http://baike.baidu.com/view/1101962.htm?fr=aladdin Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合 ...

  4. http请求之referer头与防盗链

    在网页中的占用大流量的信息可以写成这个信息在网络上的url位置,这样就会减少本网站的流量,但是其他网站也 不会随意让你使用人家的资源,因为这样的情对人家的网站没有好处,会增加人家网站的流量,所以要防止 ...

  5. spark1.1.0下使用SparkSQL

    spark1.1.0的安装参见http://blog.csdn.net/bluejoe2000/article/details/41391407 安装了spark之后,可以在 shell中执行Spar ...

  6. 通过js根据后台数据动态生成一个页面

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExportSelField ...

  7. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法

    Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...

  8. 第零篇、HTML5简介

    1.什么是HTML5? 背景:互联网的快速兴起 1>网页5.0版本 2>2014年才定制HTML5标准 3>移动先行 2.为什么要使用HTML5? 1>跨平台(可以运行所有的浏 ...

  9. Ubuntu下GCC的安装以及版本控制

    在Ubuntu下安装GCC和其他一些Linux系统有点不一样. 方法一: 该方法超简单:sudo apt-get  build-depgcc 就上面这条命令就可以搞定 方法二:sudo apt-get ...

  10. Linux操作系统是如何工作的?破解操作系统的奥秘

    学号:SA12**6112 研究笔记: 1:计算机是怎么样工作的 2:用户态到内核态切换之奥秘解析 3:进程切换之奥秘解析 本博文主要是根据前3篇笔记来总结Linux内核的工作机制. 一:操作系统工作 ...