传送门http://poj.org/problem?id=2796

题意:给你一串数字,需要你求出(某个子区间乘以这段区间中的最小值)所得到的最大值

例子:

6

3 1 6 4 5 2

L=3,R=5时这段区间总和为6+4+5=15,最小值为4,所以最后的结果为60.

思路:单调栈的板子题了。没学过单调栈的我只能现学了。单调栈分为单调递增栈,单调递减栈。而这个题呢,要用到单调递增栈。怎么维护单调栈呢?那就是在遇到一个元素大于栈顶元素时,就将该元素加入栈中。(假定即为区间最小值,区间左端点L=i,区间右端点R=i)如果遇到一个小于栈顶的元素时,则把栈里面的元素弹出来,同时记录该元素向左延申的最大长度,即更新区间左端点。在弹出栈顶元素时把这个要弹出栈的元素(栈顶元素)的右端点赋值给这个它的下一个元素(当前栈中次大元素),即更新区间右端点,同时更新答案。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e6 + 10;
struct node
{
int l;
int r;
long long num;
} s[maxn];
long long a[maxn];
long long sum[maxn];
long long ans;
int ans_l;
int ans_r;
int top;
int n;
void solve(int top)
{
int l = s[top].l;
int r = s[top].r;
//更新答案
if((sum[r] - sum[l - 1])*s[top].num >= ans)
{
ans = (sum[r] - sum[l - 1]) * s[top].num;
ans_r = r;
ans_l = l;
}
//向右延申
if(top > 0)
{
s[top - 1].r = s[top].r;
}
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%I64d", &a[i]);
//记录前缀和
sum[i] = a[i] + sum[i - 1];
}
top = -1;
for(int i = 1; i <= n; i++)
{
//初始假定a[i]为区间最小值,左区间,右区间都为i
node v;
v.l = i;
v.r = i;
v.num = a[i];
//加入的元素大于栈顶元素向左延申
while(top != -1 && s[top].num >= a[i])
{
solve(top);
//一直向左更新 ,直到某一个元素小于加入的元素
v.l = s[top].l;
top--;
}
s[++top].l = v.l;
s[top].r = v.r;
s[top].num = a[i];
}
//单调栈中元素可能不为空
while(top != -1)
{
solve(top);
top--;
}
cout << ans << endl;
cout << ans_l << " " << ans_r << endl;
}

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. poj 2796 Feel Good 单调栈区间问题

    Feel Good 题意:给你一个非负整数数组,定义某个区间的参考值为:区间所有元素的和*区间最小元素.求该数组中的最大参考值以及对应的区间. 比如说有6个数3 1 6 4 5 2 最大参考值为6,4 ...

  3. POJ 3658 Artificial Lake (单调栈)

    题意: 析:利用单调栈,维护一个单调递增的栈,首先在最低的平台开始,每次向两边进行扩展,寻找两边最低的,然后不断更新宽度. 代码如下: #pragma comment(linker, "/S ...

  4. poj 2559 Largest Rectangle(单调栈)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26549 ...

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

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

  6. POJ 3415 后缀数组+单调栈

    题目大意: 给定A,B两种字符串,问他们当中的长度大于k的公共子串的个数有多少个 这道题目本身理解不难,将两个字符串合并后求出它的后缀数组 然后利用后缀数组求解答案 这里一开始看题解说要用栈的思想,觉 ...

  7. poj 2796 Feel Good 单调队列

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

  8. [poj 2796]单调栈

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

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

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

随机推荐

  1. intellij idea 怎么全局搜索

    1.Ctrl+N按名字搜索类 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件,就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配,而且 ...

  2. Node.js的启动和调试方式

    通过node命令启动 node server/bin/www webstorm配置启动入口 pm2 全局安装:cnpm i pm2 -g 检查版本:pm2 -v 启动:cd 项目目录 pm2 star ...

  3. 大数据高可用集群环境安装与配置(07)——安装HBase高可用集群

    1. 下载安装包 登录官网获取HBase安装包下载地址 https://hbase.apache.org/downloads.html 2. 执行命令下载并安装 cd /usr/local/src/ ...

  4. Ubuntu16.04 在Windows10 系统下的安装(双系统)

    楼主最近升级了一个固态+8G双通道内存条,重装了一下win10和ubuntu系统,过程中遇到一些问题,push上来供自己和大家参考.比较好用的博客教程直接贴链接. 一.win10系统 学校有正版软件许 ...

  5. mysql 锁表的处理方式

    MySQL错误:ERROR 1205 (HY000): Lock wait timeout   处理方案:   执行mysql命令:show full processlist;   然后找出插入语句的 ...

  6. 对spring中IOC和AOP的理解

    IOC:控制反转也叫依赖注入.利用了工厂模式. 为了方便理解,分解成每条以便记忆.  1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器 ...

  7. 吴裕雄--天生自然 JAVASCRIPT开发学习:变量

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 洛谷 P5662 纪念品

    题目传送门 解题思路: 一道DP,完全背包,不过有点不同于模板.因为本题的每件物品可自由在不同的时间买卖,且不同时间价格不同. 这道题的关键在于要明白一个非常傻逼的性质,就是我在某天买了第i个物品,然 ...

  9. Arduino学习——u8glib库资料整理

    第一部分,u8glib标准语法格式: 本文使用的是DFRobot出品的LCD12864 Shield V1.0 端口占用情况: SPI Com: SCK = 13, MOSI = 11, CS = 1 ...

  10. 字符串编码研究:Unicode

    Unicode Unicode 编码系统可分为编码方式和实现方式两个层次. 1.编码方式 Unicode字符平面映射定义了所有的Unicode字符集. 2.实现方式(UTF8,UTF16) UTF-8 ...