hdu5696 区间的价值
区间的价值
我们定义“区间的价值”为一段区间的最大值*最小值。
一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1)。
现在聪明的杰西想要知道,对于长度为k的区间,最大价值的区间价值是多少。
当然,由于这个问题过于简单。
我们肯定得加强一下。
我们想要知道的是,对于长度为1~n的区间,最大价值的区间价值分别是多少。
长度为2的最优区间为4-5 答案为4*4
长度为3的最优区间为2-4 答案为2*6
长度为4的最优区间为2-5 答案为2*6
长度为5的最优区间为1-5 答案为1*6
Input单组测试数据
第一行一个数n(1<=n<=100000)。
第二行n个正整数(1<=ai<=10^9),下标从1开始。
由于某种不可抗力,ai的值将会是1~10^9内随机的一个数。(除了样例)Output输出共n行,第i行表示区间长度为i的区间中最大的区间价值。Sample Input
5
1 6 2 4 4
Sample Output
36
16
12
12
6 先用线段树维护出区间最小值和最大值;
用快排的分治思想;
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std; long long n,m,r,ans[],tree_max[],tree_min[];
long long a[]; void build(int l,int r,int v){
if(l==r){
tree_max[v]=l;
return;
}
int mid=(l+r)>>;
build(l,mid,v<<);
build(mid+,r,(v<<)+);
if(a[tree_max[v<<]]>a[tree_max[(v<<)+]])
tree_max[v]=tree_max[v<<];
else
tree_max[v]=tree_max[(v<<)+];
} void build1(int l,int r,int v){
if(l==r){
tree_min[v]=l;
return;
}
int mid=(l+r)>>;
build1(l,mid,v<<);
build1(mid+,r,(v<<)+);
if(a[tree_min[v<<]]<a[tree_min[(v<<)+]])
tree_min[v]=tree_min[v<<];
else
tree_min[v]=tree_min[(v<<)+];
} long long query(int l,int r,int x,int y,int v){
if(l==x&&r==y){
return tree_max[v];
}
int mid=(l+r)>>;
if(y<=mid) return query(l,mid,x,y,v<<);
if(x>mid) return query(mid+,r,x,y,(v<<)+);
long long aa=query(l,mid,x,mid,v<<);
long long bb=query(mid+,r,mid+,y,(v<<)+);
if(a[aa]>a[bb])
return aa;
else
return bb;
} long long query1(int l,int r,int x,int y,int v){
if(l==x&&r==y){
return tree_min[v];
}
int mid=(l+r)>>;
if(y<=mid) return query1(l,mid,x,y,v<<);
if(x>mid) return query1(mid+,r,x,y,(v<<)+);
long long aa=query1(l,mid,x,mid,v<<);
long long bb=query1(mid+,r,mid+,y,(v<<)+);
if(a[aa]<a[bb])
return aa;
else
return bb;
} void dfs(int l,int r){
if(r<l) return;
long long aa=query(,n,l,r,);
long long bb=query1(,n,l,r,);
if(aa>bb) swap(aa,bb);
long long k=a[aa]*a[bb];
for(int i=(bb-aa)+;i<=r-l+;i++)
ans[i]=max(ans[i],k);
if(a[bb]>a[aa])
dfs(aa+,r),dfs(l,aa-);
else
dfs(bb+,r),dfs(l,bb-);
} int main(){
scanf("%lld",&n);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
build(,n,);
build1(,n,);
dfs(,n);
for(int i=;i<=n;i++)
printf("%lld\n",ans[i]);
}
hdu5696 区间的价值的更多相关文章
- hdu5696区间的价值 -- 2016"百度之星" - 初赛(Astar Round2B)
Problem Description 我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知道,对于长度为k的区 ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- HDU5696:区间的价值——题解
http://acm.hdu.edu.cn/showproblem.php?pid=5696 题面是中文的我就不粘贴过来了…… ———————————————————————— 这题垃圾题!!神tm卡 ...
- 51nod 1564 区间的价值 | 分治 尺取法
51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...
- 【51nod】1564 区间的价值
题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端 ...
- 51nod 1674 区间的价值V2(思维+拆位+尺取法)
最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...
- hdu 5696 区间的价值 单调栈+rmq
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- HDU 5696 ——区间的价值——————【线段树、快排思想】
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU 5696 区间的价值 暴力DFS
Problem Description 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知 ...
随机推荐
- 201521123082 《Java程序设计》第8周学习总结
201521123082 <Java程序设计>第8周学习总结 标签(空格分隔):Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 ...
- 团队作业4——第一次项目冲刺(Alpha版本) Day6
首先和助教及老师表示抱歉,博客确实当时就写了,但是一直不算写好,因为这几天卡住了,预计实现的功能实现不了,进度跟不上,现在也在寻求解决方法. 1.站立式会议: 2. Leangoo任务分解图: 3.任 ...
- 201521123011 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1.super() 子类不能继承父类的构造方法,但可以通过super关键字去访问父类的构 ...
- 201521123099 《Java程序设计》第4周学习总结
1. 本周学习总结 2. 书面作业 注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 面向对象设计(大作业1,非常重要) 2.1 将在网上商城购物或 ...
- 201521123052《Java程序设计》第2周学习总结
1. 本周学习总结 String类一些用法 学习Array类 使用枚举 使用eclipse关联JDK源代码 使用码云管理云代码 2.书面作业 1.使用Eclipse关联jdk源代码,并查看String ...
- 201521123118《java程序与设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1. finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fi ...
- shell(sed/gawk)脚本(计算目录文件/验证电话号码/解析电子邮件地址)
1.计算目录文件 #!/bin/bash mypath=`echo $PATH | sed 's/:/ /g'`#注意` ` 和 ‘ ’ count= for directory in $mypath ...
- WebService的简单介绍与入门使用
WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式 ...
- linux文件权限解析(摘)
用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建 ...
- jsonp其实很简单【ajax跨域请求】
js便签笔记(13)——jsonp其实很简单[ajax跨域请求] 前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资 ...