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). 现在聪明的杰西想要知 ...
随机推荐
- 201521123107 《Java程序设计》第2周学习总结
第2周作业-Java基本语法与类库 1.本周学习总结 要点主要有: (1)String类 String类是本周的一个重点,String类的对象是不可变的,即String对象后就在内存中开辟了一个字符串 ...
- 201521123112《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 下面先贴出contains的源代码: public boolean cont ...
- 201521123027 <iava程序设计>第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123112《Java程序设计》第2周学习总结
1.本周学习总结 本周在课堂面授课粗略讲了<Java学习笔记>中的第三章,其内容大部分都与上学期学习的数据结构差不多,所以只是粗略的复习了一下就带过,然后通过将PTA上的实验便于我们本周的 ...
- 201521123052 《Java程序设计》 第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- Spring REST API + OAuth2 + AngularJS
http://www.baeldung.com/rest-api-spring-oauth2-angularjs 作者:Eugen Paraschiv 译者:http://oopsguy.com 1. ...
- Hibernate第六篇【多对多映射、一对一映射】
前言 前面已经讲解了一对多和多对一的映射是怎么配置了,也讲解了inverse和cascade属性对关联关系的影响,本博文讲解多对多的映射和一对一的映射! 多对多映射 需求:一个项目由多个员工开发,一个 ...
- java基础知识6-- 抽象类,抽象方法,接口,构造方法,类方法等易混淆的知识点
一.抽象类和抽象方法 (B 继承 抽象类A) 抽象类:有抽象方法的一定是抽象类 抽象方法:方法名前有abstract修饰,且方法没有方法体,即{},不需要实现任何功能,只是声明 1.抽象类中的方法有 ...
- Spring写第一个应用程序
ref:http://www.importnew.com/13246.html 让我们用Spring来写第一个应用程序吧. 完成这一章要求: 熟悉Java语言 设置好Spring的环境 熟悉简单的Ec ...
- Elasticsearch 的分页报错 result window is too large
检查自己分页查询的代码 Pageable pageable = new PageRequest(0, 10000); searchQuery.setPageable(pageable); // 分页效 ...