题意:给定一个序列,需要找出某个子序列S使得Min(a[i])*Σa[i] (i属于S序列)最大

正解:单调栈

这题的暴力还是很好想的,只需3分钟的事就可以码完,以每个点拓展即可,但这样的复杂度是O(n^2)的,肯定会TLE

以暴力的思想作为基础,再进行深层次思考,考虑每个点往周围拓展的时候,都要走到最远的地方停下来,也就是说会有一个左上限,一个右上限(命名为:pre、next),不难发现再枚举5、4、3、2、1这个序列的时候,每次都要往左扫描到最左边,显然这是做了重复的事情,于是机智的我马上想到了单调栈。为什么说具有单调性呢,因为x<y,对于x可以控制的所有范围显然y都可以控制,这不是废话吗。于是我们想到了用单调栈来解决这个问题。

什么是单调栈呢,单调栈分为单调增栈和单调减栈两种。比如说:单调增栈就是以某一个值为最小值,然后维护一个单调递增的序列。将一元素加入栈时,先判断它是否大于栈顶元素,若是大于栈顶元素,加入栈。否则,将栈顶元素出栈,直到栈顶元素小于要加入栈的元素。

对于这道题而言,我们不妨维护每个端点能够往前往后拓展的最大值,在删除栈顶元素的时候“继承”此时栈顶的范围就可以了(上面提到的单调性)

呼,这样的话这道单调栈裸题就可以AC了。记得开long long。第一次提交又没开long long然后WA了

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
typedef long long LL;
const int MAXN = ;
int n;
LL a[MAXN];
LL ans,now;
LL qian[MAXN];
int nowl,nowr; struct node{
int jilu;
int pre,next;
LL num;
}; stack<node>Stack; inline LL getlong(){
char c=getchar();LL w=;int q=;
while( (c<'' || c>'') && c!='-' ) c=getchar();
if(c=='-') c=getchar(),q=;
while(c<='' && c>='') w=w*+c-'',c=getchar();
return q?-w:w;
} inline void Init(){
scanf("%d",&n);
ans=now=-; nowl=nowr=; qian[]=;
for(int i=;i<=n;i++) a[i]=getlong(),qian[i]=qian[i-]+a[i];
while(!Stack.empty()) Stack.pop();
} inline void work(){
node jump; jump.num=a[];
jump.pre=jump.next=;
jump.jilu=;
Stack.push(jump); node ljh;
for(int i=;i<=n;i++) {
ljh.num=a[i];
ljh.pre=ljh.next=;
ljh.jilu=i; while(!Stack.empty() && a[i]<=Stack.top().num) {
jump=Stack.top();
Stack.pop();
if(!Stack.empty()) Stack.top().next+=jump.next;
ljh.pre+=jump.pre; now=jump.num*(qian[ jump.jilu+jump.next- ]-qian[ jump.jilu-jump.pre ]); if(now>ans) {
ans=now;
nowl=jump.jilu-jump.pre+; nowr=jump.jilu+jump.next-;
}
} Stack.push(ljh);
} while(!Stack.empty()) {
jump=Stack.top();
Stack.pop(); if(!Stack.empty()) Stack.top().next+=jump.next; now=jump.num*(qian[ jump.jilu+jump.next- ]-qian[ jump.jilu-jump.pre ]);
if(now>ans) {
ans=now;
nowl=jump.jilu-jump.pre+; nowr=jump.jilu+jump.next-;
}
} if(n==) ans=;
printf("%lld\n%d %d\n",ans,nowl,nowr);
} int main()
{
freopen("poj2796.in","r",stdin);
freopen("poj2796.out","w",stdout); Init(); work();
return ;
}

POJ2796 Feel Good 单调栈的更多相关文章

  1. upc组队赛1 小C的数学问题【单调栈】(POJ2796)

    小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...

  2. poj2796 维护区间栈//单调栈

    http://poj.org/problem?id=2796 题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以 ...

  3. POJ2796(单调栈)

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

  4. 【POJ2796】Feel Good 单调栈

    题目大意:给定一个长度为 N 的序列,求任意区间 [ l , r ] 中最小的\(min\{v[i],i\in[l,r] \}*\Sigma_{i=l}^rv[i]\). 题解:这是一道具有标准单调栈 ...

  5. 单调栈poj2796

    题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以4为最小值,向左右延伸,6 4 5  值为60....... ...

  6. POJ2796 Feel Good(单调栈)

    题意:给一个非负整数序列,求哪一段区间的权值最大,区间的权值=区间所有数的和×区间最小的数. 用单调非递减栈在O(n)计算出序列每个数作为最小值能向左和向右延伸到的位置,然后O(n)枚举每个数利用前缀 ...

  7. UVA 1619/POJ2796 滑窗算法/维护一个单调栈

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

  8. POJ2796【单调栈】

    题意: 题意:n个数,求某段区间的最小值*该段区间所有元素之和的最大值 思路: 主要参考:http://www.cnblogs.com/ziyi–caolu/archive/2013/06/23/31 ...

  9. POJ2796Feel Good[单调栈]

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

随机推荐

  1. 推薦使用 Microsoft Anti-Cross Site Scripting Library V3.0

    原文出至: http://blog.miniasp.com/post/2009/07/29/Recommand-Microsoft-Anti-Cross-Site-Scripting-Library- ...

  2. Stream 和 byte[]

    C# Stream 和 byte[] 之间的转换   一. 二进制转换成图片MemoryStream ms = new MemoryStream(bytes);ms.Position = 0;Imag ...

  3. Java中primitive type的线程安全性

    Java中primite type,如char,integer,bool之类的,它们的读写操作都是atomic的,但是有几个例外: long和double类型不是atomic的,因为long和doub ...

  4. MySql 中文乱码排查解决方案

    MySQL会出现中文乱码的原因不外乎下列几点: server本身设定问题,例如还停留在latin1 table的语系设定问题(包含character与collation) 客户端程式(例如php)的连 ...

  5. WPF ListView和ListBox等双击事件问题

    上两篇文章中说双击行获取不到当前数据对象问题, http://www.cnblogs.com/ligl/p/5636899.html http://www.cnblogs.com/ligl/p/562 ...

  6. 拿到腾讯实习offer的前后小事

    一.前言 本文应该算不上是面经,仅仅是自己近期一路走过的些许琐碎小事,欢迎园友吐槽,但是不要太凶残哦. 二.旧年小事 去年11月底,从上海实习公司请假回校参加研究生毕业论文开题答辩,在校忙碌了一段时间 ...

  7. PHP 实现页面静态化

    PHP文件执行阶段:语法分析->编译->运行 静态html文件执行顺序:运行 动态程序: 连接数据库服务器或者缓存服务器->获取数据->填充到模板->呈现给用户 关于优化 ...

  8. 前端人员一定要掌握的PS技巧

    一.PS与前端知多少 一般我们会认为PS是用来修改图片的,这些工作是美工人员做的事不是前端人员做的,其实这样想你就错了,因为在前端人员也是要学会一些简单的关于PS的技巧的,这样就不会应为一点点小小的需 ...

  9. Predicting purchase behavior from social media-www2013

    1.Information publication:www2013 author:Yongzheng Zhang 2.What 用社交媒体用户特征 预测用户购买商品类别(排序问题) 3.Dataset ...

  10. rhel7修改网卡命名规则

    1步:当安装完红帽RHEL7系统安装完成,您的网卡命名是这样的. 第2步:请编辑网卡的配置文件 将”/etc/sysconfig/network-scripts/ifcfg-eno16777736“的 ...