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 分析: 单调队列(单调栈) 求出每个值作为最小值时最长的影响区间,然后枚举判断 这找出最长影响区间应该算是单调 ...
随机推荐
- Unity 获得Android Context上下文
1.获取Context AndroidJavaObject context = new AndroidJavaClass ("com.unity3d.player.UnityPlayer&q ...
- 题解 CF1037D 【Valid BFS?】
不管怎么说,这都不是道紫题吧... 这里采用的思想有点类似轻重链剖分. 我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序. 这样(如果序列没错)肯定会按照序列的方式遍历完全图. ...
- ECNUOJ 2615 会议安排
会议安排 Time Limit:1000MS Memory Limit:65536KB Total Submit:451 Accepted:102 Description 科研人员与相关领域的国内外同 ...
- 洛谷 P1898 缘分计算
P1898 缘分计算 题目描述 缘分是一个外国人难以理解的中文名词.大致说来,缘分是一种冥冥中将两人(通常是情人)结合的力量.仅管这是种迷信,很多人——特别是女生——喜欢去计算它. 不幸的是,644 ...
- ArcGIS api for javascript——查询,然后单击显示信息窗口
描述 本例展示如何配置查询任务为示例的工作流程: 1.用户单击一个要素来加亮显示. 2.用户再一次单击要素来查看属性信息的 InfoWindow. 本例查询USA州,因此ESRI_StateCityH ...
- JAVA 不同类载入器命名空间的理解
曾经一直有这样一个疑惑: 都说在JAVA中,由不同类载入器载入的类在虚拟机中位于不同的命名空间下,不同命名空间下的类相互不可见. 这让我产生了一个迷惑:假设有一个类A使用了ja ...
- Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)
本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...
- 大型网站架构之JAVA中间件
中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品.常见的有: 远程服务框架中间件:主要解决各子模块之间互相访问的问题. 消息队列中间件:主要解决各子模之间消息共享 ...
- BZOJ5105: [CodePlus2017]晨跑
[传送门:BZOJ5105] 简要题意: 给出a,b,c,求a,b,c的最小公倍数 题解: 直接搞(最近刷水题有点心态爆炸) 参考代码: #include<cstdio> #include ...
- pandas 下的 one hot encoder 及 pd.get_dummies() 与 sklearn.preprocessing 下的 OneHotEncoder 的区别
sklearn.preprocessing 下除了提供 OneHotEncoder 还提供 LabelEncoder(简单地将 categorical labels 转换为不同的数字): 1. 简单区 ...