#include <cstdio>
/*
* source poj.2796
* 题目: 
* 给定一个非负数的数组 其中value[l,r] = sum(l,r) * min (l,r);
*   求 最大值和,最大值的位置
* 题解:
* 所求的区域的最小值是x的话一定是这个值向左右去延伸至比他大的元素为止
*   而这个问题的求解一般是n^2的问题,但是我们不能接受因此;
* 维护这个区间需要我们维护一个stack
* 具体操作如下
* (1)元素入栈
*    1,记录值(value, weight) -> weight 初始是1,value是入栈的值,
*     2,先让大于等于value的值出栈,并且更新 ANS [value * weight]  对比决定是否更新.   
*     3,如果这个栈顶元素也大于等于value, 把出栈的这个值的重量给目前的栈顶元素, 到步骤(2),否则到步骤(4).
*    4,把这个出栈的重量给 准备入栈的元素.
*     5,元素入栈
*   (2)元素全部入栈后 因为还有元素在里面. 剩下的元素逐个出栈,  只不过把这个元素的重量给下一个栈顶元素. 类似与插入-1.
* hint:
*
*     其实他每次出栈的 就是我们刚开说的那种区间, 以那个元素为做小值向左右扩展得到的区间值.
*
*     对于栈顶元素.
*       一个元素的入栈 会促使 左侧比他大的合并,
* 而后出栈的时候右侧肯定也都合并到自己身上,因此栈顶元素对于我们所扫描到的位置一定是合法的
*      栈顶元素肯定向右或者说向左都是达标的;
*      这是个斜率优化问题. 怀念以前,现在是个弱鸡(ง •̀_•́)ง
*/
#define min(x, y) ( (x) < (y) ? (x) : (y) )
#define max(x, y) ( (x) < (y) ? (y) : (x) )
const int N = 1e5;
struct Ans {
int l, r;
long long value;
Ans(){l = r = value = -;}
bool operator < (const Ans & rht ) const {
return value < rht.value;
}
void out(){
printf("%lld\n%d %d\n", value, l, r);
}
void show(int i) {
printf("i = %d %d %d %lld \n", i, l, r, value);
}
};
struct Info {
long long h, w;
int p;
Info(){}
Info(long long _h, long long _w, int _p):h(_h), w(_w), p(_p) {}
bool operator < (const Info & rht) const {
return this -> h < rht.h;
}
Info operator + (const Info & rht) const {
return Info( min(rht.h, this -> h), rht.w + this -> w, this -> p);
}
};
Info stack[N + ];
int pos;
Ans ans;
inline void init() {
pos = ;
ans = Ans();
}
void in(long long tmp, int i) {
Info inStack = Info(tmp, tmp, i);
Info key = Info(0x7fffffff, , -);
while(pos != && stack[pos - ].h >= inStack.h) {
key = stack[--pos] + key;
Ans wps = Ans();
wps.l = key.p;
wps.r = i - ;
wps.value = (long long )key.w * (long long )key.h; ans = max(ans, wps);
}
if (key.p != -) {
inStack = key + inStack;
}
stack[pos++] = inStack;
}
int main() {
int n;
long long tmp;
while(~scanf("%d", &n)) {
init();
for(int i = ; i <= n; ++i) {
scanf("%lld", &tmp);
in(tmp, i);
}
in(, n + );
ans.out();
}
return ;
}

poj2796的更多相关文章

  1. POJ2796 Feel Good 单调栈

    题意:给定一个序列,需要找出某个子序列S使得Min(a[i])*Σa[i] (i属于S序列)最大 正解:单调栈 这题的暴力还是很好想的,只需3分钟的事就可以码完,以每个点拓展即可,但这样的复杂度是O( ...

  2. POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum

    http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...

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

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

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

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

  5. POJ2796 单调队列

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

  6. POJ2796/DP/单调栈

    题目链接[http://poj.org/problem?id=2796] 题意:给出一个数列,要求在这个数列里找到一个区间,使得在这个区间里的最小值*SUM[l,r]最大. 题解:思路来源于[http ...

  7. POJ2796(单调栈)

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

  8. 【POJ2796】Feel Good 单调栈

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

  9. 单调栈poj2796

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

  10. poj2796 Feel good

    题目给出N个数,找出一段区间使得区间最小值乘区间和的值最大 其中N<=100000 分析: 单调队列(单调栈) 求出每个值作为最小值时最长的影响区间,然后枚举判断 这找出最长影响区间应该算是单调 ...

随机推荐

  1. HNU 12886 Cracking the Safe 二十四点的判断

    经典的一个题,今天竟然写跪了…… 题意: 给你4个数字,让你判断是否能通过四则运算和括号,凑成24点. 思路: 暴力枚举运算顺序和运算符. 代码: #include <iostream> ...

  2. 怎样查看电脑的IP地址

    在DOW窗体 :cmd->ipconfig 见截图:

  3. [Python] Read and plot data from csv file

    Install: pip install pandas pip install matplotlib # check out the doc from site import pandas as pd ...

  4. 利用photoshop的动作功能实现图片批处理操作

    首先,通过"窗体菜单"点击"动作".启动动作栏. 然后.通过动作栏的菜单,新建动作. 接着,完毕一个标准操作,包含打开图像,图像处理或者格式转换,另存为,等. ...

  5. 智课雅思短语---二、exert positive/ negative effects on…

    智课雅思短语---二.exert positive/ negative effects on… 一.总结 一句话总结:对…产生有利/不利的影响 1.the advantages far outweig ...

  6. C#一些延时函数

    sleep延时方法: System.Threading.Thread.Sleep(); //毫秒 在C#窗口程序中,如果在主线程里调用Sleep,在Sleep完成之前, 界面呈现出假死状态,不能响应任 ...

  7. A电脑能ping 通B电脑,但B电脑无法ping能和访问B

    过程: A电脑共享了打印机,B电脑想连接A的打印机,发现拒绝访问,无法登录A电脑 问题: A电脑能ping 通B电脑,但B电脑无法ping能和访问B 原因:A电脑禁用了共享访问 处理:使用一键共享设置 ...

  8. 原型,构造函数,实例,__proto__

    再说说__proto__,这个孩子性格慢向,所以即使在现代浏览器广为支持得今天也不建议使用,性能特别慢,而且影响所有来自该[[prototype]]的对象.只是拿出来了解了解: 1.它是个啥? 原型对 ...

  9. Hexo Daemon

    前提 今天中午的时候发现自已网站突然不能访问了,我猜肯定是后台的hexo服务异常自动kill掉了.果然登录服务器ps -ef | grep hexo查看进程,果然发现hexo的进程不在了.由于我将输出 ...

  10. 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码

    TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...