P2422 良好的感觉
P2422 良好的感觉
给定一段序列, 其中元素 \(0 \leq a_{i} \leq 100000\)
定义一段子段 \([L, R]\) 的舒适值为 \(\min_{L \leq i \leq R}a_{i} * \sum_{i = L}^{R}a_{i}\)
求最大舒适值(并定位其位置)
\(n \leq 500000\)
Solution
首先 \(O(n^{2})\) 枚举区间, 前缀和乱搞啥的显然不合理
考虑式子, 后一项我们可以前缀和求出, 于是重点放在 \(\min_{L \leq i \leq R}a_{i}\) 上
对于一个 \(a_{i}\), 贪心可知覆盖越广舒适值越大
枚举每一个 \(a_{i}\) 作为区间最小值, 然后可以单调栈 \(O(1)\) 求出每个 \(d_{i}\) 对应的最长左区间
同理可以 \(O(n)\) 求出对应右端点
总复杂度 \(O(n)\)
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(LL i = (x);i <= (y);i++)
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 200019, INF = 0xfffffffffffffff;
LL num;
LL a[maxn], sum[maxn];
LL l[maxn], r[maxn];
struct Stack{
LL Index, val;
}S[maxn];
LL top;
void get_l(){
top = 0;
S[++top].Index = 0;
S[top].val = -INF;
REP(i, 1, num){
while(top >= 1 && S[top].val >= a[i])top--;
l[i] = S[top].Index + 1;
S[++top].Index = i;
S[top].val = a[i];
}
}
void get_r(){
top = 0;
S[++top].Index = num + 1;
S[top].val = -INF;
for(LL i = num;i >= 1;i--){
while(top >= 1 && S[top].val >= a[i])top--;
r[i] = S[top].Index - 1;
S[++top].Index = i;
S[top].val = a[i];
}
}
int main(){
while(scanf("%lld", &num) != EOF){
memset(sum, 0, sizeof(sum));
memset(a, 0, sizeof(a));
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
REP(i, 1, num)a[i] = RD(), sum[i] = sum[i - 1] + a[i];
get_l();
get_r();
LL ans = 0, L = 0, R = 0;
REP(i, 1, num){
if((sum[r[i]] - sum[l[i] - 1]) * a[i] >= ans){
ans = (sum[r[i]] - sum[l[i] - 1]) * a[i];
L = l[i], R = r[i];
}
}
printf("%lld\n%lld %lld\n\n", ans, L, R);
}
return 0;
}
P2422 良好的感觉的更多相关文章
- 洛谷 P2422 良好的感觉 题解
P2422 良好的感觉 题目描述 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感 ...
- P2422 良好的感觉(两头单调)
描述:https://www.luogu.com.cn/problem/P2422 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人 ...
- luogu P2422 良好的感觉 单调栈
Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long using namespace std; v ...
- 洛谷P2422 良好的感觉
题目意思就是:最大化一个区间的和与这个区间的最小值的乘积. 换一个角度看问题,如果我们穷举一个最小值 $ a_i $ ,然后往左右扩展,显然是对的,复杂度 $ O(n^2) $.所以我们要优化一下这个 ...
- 【Luogu】P2422良好的感觉(单调栈)
题目链接 写代码能力需要极大提升.我在五分钟之内想到了单调栈,然后花了一个小时的时间去看我单调队列为啥写错了…… 首先这题需要转换自己的思维.枚举所有“最小点”,然后看它往左往右最大能扩展多少. 维护 ...
- 【P2422】良好的感觉(单调栈优化DP//奇怪的暴力)
话说正解是单调栈优化DP,然而貌似根据某种玄学的推算,这个题暴力出解貌似也是可以的.首先,我们枚举所有的点作为最小点,然后横向展开,遇到更小的就停止...然后再操作一下,看上去时间O(N^2),然而由 ...
- 用Go语言做产品半年的一些感觉
用Go语言做产品刚好半年,有一些感觉跟大家说道说道. 在使用Go之前,我常常想象,无法使用先进的Debug工具会对工作进度造成多么巨大的影响.甚至在Visual Studio的娇惯下认为,不能调试基本 ...
- 推荐一篇关于java 学习的文章,感觉写的很不错
---恢复内容开始--- 很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛 ...
- 第一次使用UML的感觉
刚开始接触的时候,其实我内心是拒绝的,因为感觉这种软件之前接触过,觉得就是相当于思维导图那种的. 可当自己使用的时候,觉得大纲总体上是类似是规划方向的,可是细节却让人深思,用什么图标,特别是用什么线, ...
随机推荐
- linux及安全第五周总结
给MenuOS增加time和time-asm命令 中间过程已省略了,我们所做的只是将menu更新 具体命令如下 rm menu -rf 强制删除 git clone http://github.com ...
- 同步手绘板——android端取色
作为绘图软件,颜色的选取必不可少,在刚开始取色时,所选颜色和显示颜色始终不一致,比如选取白色显示绿色,在这个问题上消耗了太多的时间,后来发现是比例问题,通过修改实现恰当的取色.
- pl/sql破解方法
转载源:http://blog.csdn.net/oscar999/article/details/2123803 打开注册表在run下输入regedit删除1.HKEY_CURRENT_USER/S ...
- 实验二 合作:王宏财 http://www.cnblogs.com/wanghongcai/
package 四则运算; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JOptionPane; ...
- 5-Python3从入门到实战—基础之数据类型(列表-List)
Python从入门到实战系列--目录 列表定义 list:列表(list)是Python内置的一种数据类型,list是一种有序的集合,索引从0开始,可以进行截取.组合等: //创建列表 list1 = ...
- shell脚本--变量与数组
Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量 本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用. 普通变量 ...
- Ping命令的另一种使用方法
今天实习结束休息的时候无聊,于是便想看看机房有多少机器,IP是什么,有没有什么小漏洞. 依次使用了netstat.ping.Telnet以后,不小心输入了这样一个东西 当时按下回车以后,心里想的是这样 ...
- Vue的filter属性
Vue.filter('sss',function(data){ //可以使用逻辑处理数据 data += '123'; return data*10; }) new Vue({ el:'#app', ...
- @Autowired的使用:推荐对构造函数进行注释
在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下: Spring Team recommends "Always use constructor based d ...
- Qt__QWidget::update()与Qwidget::repaint()的区别
QT事件的产生 1.操作系统产生 操作系统将获取的事件,比如鼠标按键,键盘按键等keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEv ...