poj2796
#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的更多相关文章
- POJ2796 Feel Good 单调栈
题意:给定一个序列,需要找出某个子序列S使得Min(a[i])*Σa[i] (i属于S序列)最大 正解:单调栈 这题的暴力还是很好想的,只需3分钟的事就可以码完,以每个点拓展即可,但这样的复杂度是O( ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- upc组队赛1 小C的数学问题【单调栈】(POJ2796)
小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...
- poj2796 维护区间栈//单调栈
http://poj.org/problem?id=2796 题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以 ...
- POJ2796 单调队列
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8041 Accepted: 2177 Case Ti ...
- POJ2796/DP/单调栈
题目链接[http://poj.org/problem?id=2796] 题意:给出一个数列,要求在这个数列里找到一个区间,使得在这个区间里的最小值*SUM[l,r]最大. 题解:思路来源于[http ...
- POJ2796(单调栈)
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 12987 Accepted: 3639 Case T ...
- 【POJ2796】Feel Good 单调栈
题目大意:给定一个长度为 N 的序列,求任意区间 [ l , r ] 中最小的\(min\{v[i],i\in[l,r] \}*\Sigma_{i=l}^rv[i]\). 题解:这是一道具有标准单调栈 ...
- 单调栈poj2796
题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以4为最小值,向左右延伸,6 4 5 值为60....... ...
- poj2796 Feel good
题目给出N个数,找出一段区间使得区间最小值乘区间和的值最大 其中N<=100000 分析: 单调队列(单调栈) 求出每个值作为最小值时最长的影响区间,然后枚举判断 这找出最长影响区间应该算是单调 ...
随机推荐
- 洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课
这里的先后关系可以看成节点和父亲的关系 在树里面,没有父亲肯定就没有节点 所以我们可以先修的看作父亲,后修的看作节点 所以这是一颗树 这题和上一道题比较相似 都是求树上最大点权和问题 但这道题是多叉树 ...
- XML和Schema命名空间详解
来源:https://blog.csdn.net/wanghuan203/article/details/9204337 XML和Schema具有无关平台,技术厂商,简单,规范统一等特点,极具开放性, ...
- 数据库中Select For update语句的解析
----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...
- 洛谷 P1898 缘分计算
P1898 缘分计算 题目描述 缘分是一个外国人难以理解的中文名词.大致说来,缘分是一种冥冥中将两人(通常是情人)结合的力量.仅管这是种迷信,很多人——特别是女生——喜欢去计算它. 不幸的是,644 ...
- 第六课 Struts的视图组件
Struts框架的视图负责为客户提供动态网页内容. Struts的视图主要由JSP网页构成.此外还包含客户化的标签和ActionForm Bean.这些组件提供了 对国际化.接收用户输入的表单数据.表 ...
- mediawiki使用笔记
https://www.cnblogs.com/ToDoToTry/p/4475067.html
- Git的日常处理流程
前提 本地有2个分支,一个是master,还有一个是local master 默认追踪origin/master local 通过git branch -u origin/master来映射 开发的时 ...
- wcf rest系列文章
http://www.cnblogs.com/artech/archive/2012/02/15/wcf-rest.html 需要注意的是,发布的服务,可以在web behavior中指定显示help ...
- POJ - 3846 Mountain Road 动归
POJ - 3846 Mountain Road 题意:n个人要过桥,有的人从左边来,有的人从右边来,给你他们到达桥一端的时间和过桥所需要的时间,要求相向而行的只能有一人,对于每一个点,不能在10s内 ...
- 2017.9.17校内noip模拟赛解题报告
预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Ti ...