UVA1619 感觉不错 Feel Good(良好的感觉) 题解
0.题面:
给出正整数n和一个(1 <= n <= 100 000)长度的数列,要求找出一个子区间,使这个子区间的数字和乘上子区间中的最小值最大。输出这个最大值与区间的两个端点。
1.思路
一开始试图使用单调栈,然而在调试一上午无果后愤然打了个分治,然后就过了233
根据分治三步法,算法流程分为:
1.分解:定义 \(dfs(l,r)\) 为区间 \([l,r]\) 的最优解,\(mid = (l+r)/2\) ,可以把问题分为 \(dfs(l,mid)\) 和 \(dfs(mid+1,r)\) 两部分,分别对应最优解完全位于左子区间和右子区间的情况。
2.边界:当 \(l=r\) 时,\(dfs(l,r)={a_l}^2\)。(数列为\(a\))
3.合并:在第一步处理了最优解完全位于左子区间和右子区间的情况,还有最优解跨越 \(mid\) 的情况没处理。注意到当最小值一定时,区间越大越好,所以可以从大到小地选择最大值,再从中点开始往左右两端“放宽”当前区间。
2.Code
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000000
typedef long long ll;
int n;
ll a[MAXN+5],sum[MAXN+5],ans;
struct answ{
int l,r;ll v;
answ(){
l=r=v=0;
}
answ(int L,int R,ll V){
l=L;r=R;v=V;
}
};
bool operator < (answ l,answ r){
return l.v<r.v;
}
struct ST{
ll st[MAXN+1][31];
int query(int l,int r){
int k=log2(r-l+1);
return min(st[l][k],st[r-(1<<k)+1][k]);
}
void build(){
for(int i=1;i<=n;i++){
st[i][0]=a[i];
}
for(int j=1;j<=30;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
}qwq;
ll query(int l,int r){
return qwq.query(l,r)*(sum[r]-sum[l-1]);
}//求一个区间的“数字和乘上子区间中的最小值”
answ dfs(int l,int r){//分治主体
int mid=(l+r)/2;
if(l==r){//边界
return answ(l,r,query(l,r));
}
answ ans=max(dfs(l,mid),dfs(mid+1,r));
vector<int> tmp;
for(int i=l;i<=r;i++){
tmp.push_back(a[i]);
}
sort(tmp.begin(),tmp.end());reverse(tmp.begin(),tmp.end());//从大到小地取区间最小值
int L=mid,R=mid+1;
ans=max(ans,answ(L,R,query(L,R)));
for(int i=0;i<tmp.size();i++){//由于最小值“逐渐放宽”,所以区间只增不减
if(tmp[i]>a[mid]||tmp[i]>a[mid]){
continue;
}
while(a[L-1]>=tmp[i]&&L!=l){
L--;
}
while(a[R+1]>=tmp[i]&&R!=r){
R++;
}//区间越大越好
ans=max(ans,answ(L,R,query(L,R)));
}
return ans;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
qwq.build();
answ ans=dfs(1,n);
cout<<ans.v<<endl;
cout<<ans.l<<" "<<ans.r<<endl;
return 0;
}
UVA1619 感觉不错 Feel Good(良好的感觉) 题解的更多相关文章
- 推荐一些常用感觉不错的jQuery插件
转:http://www.cnblogs.com/v10258/p/3263939.html JQuery插件繁多,下面是个人在工作和学习中用到感觉不错的,特此记录. UI: jquery UI(官方 ...
- 最近发现docker感觉不错
最近发现docker感觉不错,接下来开始学习docker方面的技术.lxc也可以学学. storm,kafka也要熟悉起来.
- 逛csdn看见的一个知识阶梯,感觉不错
逛csdn看见的一个知识阶梯,感觉不错: 计算机组成原理 → DOS命令 → 汇编语言 → C语言(不包括C++).代码书写规范 → 数据结构.编译原理.操作系统 → 计算机网络.数据库原理.正则表 ...
- 亲测!阿里云公共DNS,感觉不错!
最近阿里推出了公共DNS,这对于普通的网友来说估计没什么用处,但对于我们建站人来说,确实是一个不错的消息.一听说阿里出公共DNS,博主就立马换电信的DNS换下了.经过这几天的测试,相当满意! 个人感觉 ...
- 第一次用python,成功的感觉不错。
自己的作业: 1. count = 0 while count <= 9 : count += 1 if count == 7 : continue print (count) 2. count ...
- 继GitHub的Copilot收费后,亚马逊推出了 CodeWhisperer,感觉不错哟!
Copilot 是 Github 推出的一款人工智能编程助手,推出仅一年就受到大量开发者的追捧(据官方统计有 120 万用户).然而,自 2022 年 6 月起,它改为了付费订阅模式(每月 10 美元 ...
- Monty Hall Problem的一个图解,感觉不错
从Coursera.org上的台大概率课讨论组里拿来的 如果不转换,选中汽车的概率是1/3,非常显然. 但转换后选中汽车的概率变成2/3就有点反直觉了,并不是太容易想明白. 因为转换其实有4种:汽车- ...
- 关于Xcode调试的帖子,感觉不错,转来看看
http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1 http://www.raywenderlich.com/10505 ...
- SVN的命令解析(感觉不错就转了)
本文链接: http://www.php-oa.com/2008/03/12/svnminglingzailinuxxiadeshiyong.html .将文件checkout到本地目录 svn ch ...
随机推荐
- 【LeetCode】1021. Best Sightseeing Pair 最佳观光组合(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】45. Jump Game II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcod ...
- Saving Beans(hud3037)
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 理解HTTP协议中的multipart/form-data
前提 之前在写一个通用HTTP组件的时候遇到过媒体(Media)类型multipart/form-data的封装问题,这篇文章主要简单介绍一下HTTP协议中媒体类型multipart/form-dat ...
- [Kaiming]Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
目录 概 主要内容 PReLU Kaiming 初始化 Forward case Backward case He K, Zhang X, Ren S, et al. Delving Deep int ...
- docker-部署jumpserver
jumpserver https://jumpserver.org/ Docker 部署 jumpserver 堡垒机 容器部署 jumpserver-1.4.10 服务端 #最好单一个节点 容器运行 ...
- 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长、宽、高分别为 8 米、5 米、3 米
查看本章节 查看作业目录 需求说明: 使用 JavaScript自定义函数计算出教室的体积大小,其中教室的长.宽.高分别为 8 米.5 米.3 米 实现思路: 创建 HTML 页面 在页面的 < ...
- [特别篇] 记JZ冬令营(Finished)
1.16 走错班了, 去了全是大佬的1班, 然后灰溜溜滚回2班了. 去参加开营仪式. 然而昏昏欲睡... 实在太累了澡也没洗.. 群英云集, 多是感慨. 当时依依惜别和铮铮誓言, 在重逢中无语凝噎. ...
- 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- [Beyond Compare] 排除/忽略 .svn 文件夹
[Beyond Compare] Exclude .svn folders Beyond Compare 3 Session >> Session Settings... >> ...