poj 2796 Feel Good 单调栈区间问题

时间:2022-09-03 20:55:10

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即可;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int N = ;
int a[N],stk[N];// stk[]存储的是标号 不是直接的值
ll sum[N],ans = -;
int main()
{
int p = ,ansl,ansr,n;
read1(n);
rep1(i,,n){
read1(a[i]);
sum[i] += sum[i-] + a[i];
}
a[++n] = -;stk[] = ;// 维护一个单调递增的栈
rep1(i,,n){
while(p && a[i] < a[stk[p]]){
int l = stk[p-];// [l+1,i-1]最小值为a[stk[p]]
ll tmp = 1LL*a[stk[p]]*(sum[i-] - sum[l]);
if(tmp > ans)
ans = tmp,ansl = l+,ansr = i-;
p--;
}
stk[++p] = i;
}
printf("%I64d\n%d %d\n",ans,ansl,ansr);
return ;
}

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&lpar;单调栈区间极差&rpar;

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

  3. POJ - 2796 Feel Good 单调递增栈&plus;前缀和

    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. &lbrack;poj 2796&rsqb;单调栈

    题目链接: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. 使用PHP的正则抓取页面中的网址

    最近有一个任务,从页面中抓取页面中所有的链接,当然使用PHP正则表达式是最方便的办法.要写出正则表达式,就要先总结出模式,那么页面中的链接会有几种形式呢?   链接也就是超级链接,是从一个元素(文字. ...

  2. storm在linux系统下安装调试

    安装: 安装 zookeeper : 下载 zookeeper :http://zookeeper.apache.org/releases.html#download. 将 zookeeper-3.4 ...

  3. Android用户界面 UI组件--TextView及其子类&lpar;二&rpar; Button&comma;selector选择器&comma;sharp属性

    1.XML文件中的OnClick 属性可以指定在Activity中处理点击事件的方法,Activity中必须定义该属性指定的值作为方法的名字且有一个View类型的参数,表示此物件被点击. 2.使用se ...

  4. AFNetWorking POST Multi-Part Request 上传图片

    这些天来,做图片上传的时候,我遇到一个问题.对我来说,这只是一个附加的图片将请求超时,这里是代码: AFHTTPRequestOperationManager *manager = [AFHTTPRe ...

  5. Calendar使用方法

    Calendar类的静态方法getInstance()可以初始化一个日历对象: Calendar now = Calendar.getInstance(); 可以使用下面三个方法把日历定到任何一个时间 ...

  6. WSDL文件

    WSDL: <!--一次webservice调用,其实并不是方法调用,而是发送SOAP消息 ,即xml片段--> <!--以上一篇中的wsdl文档为例,这里我将注释写到文档中 --& ...

  7. layui:数据表格如何合并单元格

    layui.use('table', function () { var table = layui.table; table.render({ elem: '#applyTab' , url: '$ ...

  8. 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现

    [Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...

  9. Tomcat报错java&period;lang&period;ClassNotFoundException&colon; 2localhost&period;org&period;apache&period;juli&period;FileHandler

    Can't load log handler "1catalina.org.apache.juli.FileHandler" java.lang.ClassNotFoundExce ...

  10. P3P解决cookie跨域

    P3P是什么 P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护.   P3P标准的构想是:Web 站点的隐私策略应该告 ...