poj 2769 感觉♂良好 (单调栈)

比尔正在研发一种关于人类情感的新数学理论。他最近致力于研究一个日子的好坏,如何影响人们对某个时期的回忆。 比尔为人的一天赋予了一个正整数值。 比尔称这个值为当天的情感价值。情感价值越大,日子过的越好。比尔认为,某个时期人的情感,与某一时期的情感价值总和,乘以这一阶段的最小情感价值成正比。这个想法表示,一段时期的好心情可以被糟糕的一天破坏。 现在比尔正在审视自己的生活,并希望找到最有价值的人生阶段。请你帮帮他。由于他过度♂劳累,他的生命天数n<=10000。

这道题的思路和矩阵那道题一样,都是假定某个数为最小值,向左/向右扩展。求向左/向右最近最小值就是用单调栈。思路不详细说了。

然而我发现了单调栈的两个要素:维护与求最值。似乎能用单调栈解的题目,都必须满足,能在维护单调栈的同时,均摊O(1)求出最优解。所以能用单调栈解的题目都有这种很特殊的性质。如果不确定是不是玄学解法,应该证一证。

#include <cstdio>
using namespace std; typedef long long LL;
const int maxn=1e5+5, INF=1e9;
struct stack{
int t, a[maxn];
void push(int x){ a[++t]=x; }
void pop(){ if (--t==-1) ++t; }
int top(){ return a[t]; }
void RESET(){ t=0; }
}s; LL ans, sum[maxn];
int n, ans2, a[maxn];
int left[maxn], right[maxn]; int main(){
while (~scanf("%d", &n)){ //可能此处bug
ans=ans2=0;
for (int i=1; i<=n; ++i){
scanf("%d", &a[i]);
sum[i]=sum[i-1]+a[i];
}
a[0]=a[n+1]=-INF; s.push(0);
for (int i=1; i<=n; ++i){
while (a[i]<=a[s.top()]) s.pop();
left[i]=s.top(); s.push(i);
}
s.RESET(); s.push(n+1);
for (int i=n; i>0; --i){
while (a[i]<=a[s.top()]) s.pop();
right[i]=s.top(); s.push(i);
} LL v;
for (int i=1; i<=n; ++i){
v=a[i]*(sum[right[i]-1]-sum[left[i]]);
if (v>=ans){ ans=v; ans2=i; } //可能此处bug
}
printf("%lld\n%d %d\n", ans, left[ans2]+1, right[ans2]-1);
s.RESET();
}
return 0;
}

poj 2769 感觉♂良好 (单调栈)的更多相关文章

  1. 【P2422】良好的感觉(单调栈优化DP//奇怪的暴力)

    话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的.首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止...然后再操作一下,看上去时间O(N^2),然而由 ...

  2. POJ 3658 Artificial Lake (单调栈)

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

  3. 【Luogu】P2422良好的感觉(单调栈)

    题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...

  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 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20408   Accepted: 5632 Case T ...

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

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

  7. poj_2559 单调栈

    题目大意 给出一个柱形图中柱子的高度,每个柱子的宽度为1,柱子相邻.求出柱形图中可能形成的矩形的最大面积. 题目分析 以每个柱子(高度为h[i])为中心,向两边延展求出以该h[i]为高度的矩形的最大宽 ...

  8. 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar

    t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...

  9. Poj 3250 单调栈

    1.Poj 3250  Bad Hair Day 2.链接:http://poj.org/problem?id=3250 3.总结:单调栈 题意:n头牛,当i>j,j在i的右边并且i与j之间的所 ...

随机推荐

  1. ASP.Net .Net4.0 HTTP 错误 404.17 - Not Found

    源:ASP.Net .Net4.0 HTTP 错误 404.17 - Not Found 用了网上很多方法,最后是用这个网友的方法解决的,在此做个记录. VS2010编写WebService与在IIS ...

  2. 20145239 实验一 Java开发环境的熟悉(Windows + IDEA)

    实验一 Java开发环境的熟悉(Windows + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序:2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JV ...

  3. WIFI模块ESP8266的使用指南【转】

    本文转载自:http://www.itdadao.com/articles/c15a814052p0.html 本文主要对讲述ESP8266模块硬件连接工作,以及作为服务器和客户端情况下的配置实现的详 ...

  4. BZOJ 1232 [Usaco2008Nov]安慰奶牛cheer:最小生成树【树上dfs性质】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1232 题意: 给你一个无向图,n个点,m条边. 每条边有边权len[i][j],每个点有点 ...

  5. HDU 4336 Card Collector:状压 + 期望dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意: 有n种卡片(n <= 20). 对于每一包方便面,里面有卡片i的概率为p[i],可 ...

  6. 一些flag

    连续两道组合计数题 WA 在杨辉三角上,TM 我要是联赛杨辉三角萎了就剁*. 又连续两道题萎在数组越界上,TM 我要是联赛数组越界就吃*.

  7. listen 77

    Your Dog Wants YOUR Food Does your puppy turn his nose up at his own chow—because he wants some of w ...

  8. hdu-5793 A Boring Question(二项式定理)

    题目链接: A Boring Question Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java ...

  9. bzoj4555: 求和sum 快速傅立叶变换

    题目大意 给定\(S(n,m)\)表示第二类斯特林数,定义函数\(f(n)\) \[f(n) = \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*(j!)\] 给定正整数\(n, ...

  10. dubbo的防痴呆设计

    项目中也经常会遇到各种因为配置而引入的问题,很多技术支持解决不掉就找开发,结果发现大部分还是配置错误或网络不通等.如果在设计之初就能考虑到并针对这些问题做出应对设计,甚至给出异常的解决方案,确实可以减 ...