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). 现在聪明的杰西想要知 ...
随机推荐
- css样式实现立方体制作
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 201521123051 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 使用工具:百度脑图 1.2 使用常规方法总结其他上课内容.(多态) 多态的定义:父类的引用指向子类的对象. 父类的引用:一是指父类变 ...
- 第2周作业-Java基本语法与类库(20170227-20170304)
本周学习总结 (1)这周学习认识和熟悉了java的一些类型和变量: (2)学习了java的运算符基本使用方法: (3)了解了如何建立远程仓库和本地仓库,和如何让java代码在临时储存,本地仓库和远程仓 ...
- Python[小甲鱼006常用操作符]
1.操作符 下面有一些需要注意的操作符 >>>3 ** 2 9 上面这个代表着平方 即 3的平方 >>>3 ** 5 243 ...
- 201521123014 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库是为了实现一定目的按某种规则组织起来的"数据"的"集合".常见的数 ...
- 为bookStore添加权限【动态代理和注解】
前言 目前为止,我们已经学习了动态代理技术和注解技术了.于是我们想要为之前的bookStore项目添加权限控制-.. 只有用户有权限的时候,后台管理才可以进行相对应的操作-.. 实现思路 之前我们做权 ...
- hadoop源码import到eclipse工程
1.解压hadoop-1.1.2.tar.gz,重点在src文件夹 2.在eclipse中通过菜单栏创建一个java工程,工程名随便 3.在创建的工程上,点击右键,在弹出菜单中选择最后一项,在弹出窗口 ...
- Sublime Text 3 全程详细图文原创教程
Sublime Text 3 全程详细图文原创教程(持续更新中...) 一. 前言 使用Sublime Text 也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知.最初也是不知道从何 ...
- OC——关于KVO
我们知道在WPF.Silverlight中都有一种双向绑定机制,如果数据模型修改了之后会立即反映到UI视图上,类似的还有如今比较流行的基于MVVM设计模式的前端框架,例如Knockout.js.其实在 ...
- Data_Struct(LinkList)
最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...