poj 2769 感觉♂良好 (单调栈)
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 感觉♂良好 (单调栈)的更多相关文章
- 【P2422】良好的感觉(单调栈优化DP//奇怪的暴力)
话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的.首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止...然后再操作一下,看上去时间O(N^2),然而由 ...
- POJ 3658 Artificial Lake (单调栈)
题意: 析:利用单调栈,维护一个单调递增的栈,首先在最低的平台开始,每次向两边进行扩展,寻找两边最低的,然后不断更新宽度. 代码如下: #pragma comment(linker, "/S ...
- 【Luogu】P2422良好的感觉(单调栈)
题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...
- poj 2559 Largest Rectangle(单调栈)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26549 ...
- poj 2796 Feel Good单调栈
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20408 Accepted: 5632 Case T ...
- POJ 3415 后缀数组+单调栈
题目大意: 给定A,B两种字符串,问他们当中的长度大于k的公共子串的个数有多少个 这道题目本身理解不难,将两个字符串合并后求出它的后缀数组 然后利用后缀数组求解答案 这里一开始看题解说要用栈的思想,觉 ...
- poj_2559 单调栈
题目大意 给出一个柱形图中柱子的高度,每个柱子的宽度为1,柱子相邻.求出柱形图中可能形成的矩形的最大面积. 题目分析 以每个柱子(高度为h[i])为中心,向两边延展求出以该h[i]为高度的矩形的最大宽 ...
- 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar
t老师的做法好神…… 题目描述 桌面上有 n 个水果,分别是苹果和橘子.Bytea需要从水果中选择连续的一个区间,并从左到右或从右到左拿水果,且过程中橘子的数量必须始终不小于苹果的数量.求最长的区间大 ...
- Poj 3250 单调栈
1.Poj 3250 Bad Hair Day 2.链接:http://poj.org/problem?id=3250 3.总结:单调栈 题意:n头牛,当i>j,j在i的右边并且i与j之间的所 ...
随机推荐
- 20170325 ABAP调用webservice
转自:http://www.cnblogs.com/SolisOculus/archive/2013/04/01/2993198.html 在ABAP中调用Webservice 1.创建Pro ...
- Oracle数据库之SQL基础和分支循环
一.SQL基础语言 DECLARE --声明 a ); --变量或对象 BEGIN a:='小明';-- := 表示给一个变量赋值 dbms_output.put_line(a); --输出用 dbm ...
- 解决MAC Appium设备连不上IOS的的问题'idevice_id' program is not installed
解决MAC Appium设备连不上IOS的的问题 错误的: [XCUITest] The 'idevice_id' program is not installed. If you are runni ...
- CUDA:纹理内存
纹理内存: 与常量内存类似,纹理内存是另一种形式的只读内存,并且同样缓存在芯片上.因此某些情况下能够减少对内存的请求并提供高效的内存带宽.纹理内存是专门为那些在内存访问模式中存在大量空间局部性的图形应 ...
- js正則函數 match、exec、test、search、replace、split 使用介紹集合
match 方法 使用正則表達式模式對字元串執行查找,並將包含查找的結果作為數組返回. stringObj.match(rgExp) 參數 stringObj 必選項.對其進行查找的 String 對 ...
- laravel基础课程---6、请求(如何获取当前 HTTP 请求的实例)
laravel基础课程---6.请求(如何获取当前 HTTP 请求的实例) 一.总结 一句话总结: 依赖注入:通过依赖注入的方式来获取当前 HTTP 请求的实例:public function sto ...
- html5--1.16 内联框架
html5--1.16 内联框架 学习要点: 1.iframe内联框架2.综合实例1 1.iframe内联框架 1.iframe元素用来在文档中添加一个内联框架. 2.iframe为body元素的子元 ...
- 分享知识-快乐自己:Java 中 的String,StringBuilder,StringBuffer三者的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1):首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer &g ...
- PS 滤镜— — sparkle 效果
clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...
- P1417烹调方案——背包问题中的排序
题目:https://www.luogu.org/problemnew/show/P1417 与普通的01背包不同的一点是加入物品的顺序对结果有影响,这里可以考虑贪心的想法,把对全局影响最小的物品排在 ...