HDU 5696 ——区间的价值——————【线段树、快排思想】
区间的价值
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 662 Accepted Submission(s): 329
一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1)。
现在聪明的杰西想要知道,对于长度为k的区间,最大价值的区间价值是多少。
当然,由于这个问题过于简单。
我们肯定得加强一下。
我们想要知道的是,对于长度为1∼n的区间,最大价值的区间价值分别是多少。
样例解释:
长度为1的最优区间为2−2 答案为6∗6
长度为2的最优区间为4−5 答案为4∗4
长度为3的最优区间为2−4 答案为2∗6
长度为4的最优区间为2−5 答案为2∗6
长度为5的最优区间为1−5 答案为1∗6
第一行一个数n(1≤n≤100000)。
第二行n个正整数(1≤ai≤109),下标从1开始。
由于某种不可抗力,ai的值将会是1∼109内<b style="color:red;">随机产生</b>的一个数。(除了样例)
1 6 2 4 4
16
12
12
6
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
#pragma comment(linker, "/STACK:102400000,102400000")
const int maxn = 1e5+300;
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef unsigned long long ULL;
struct Seg{
LL val, Min, Max;
int idmin, idmax;
}segs[maxn*4];
LL a[maxn];
LL ans[maxn];
int n;
void PushUP(int rt){
segs[rt].Max = max(segs[rt*2].Max,segs[rt*2+1].Max);
segs[rt].Min = min(segs[rt*2].Min,segs[rt*2+1].Min);
if(segs[rt*2].Max > segs[rt*2+1].Max)
segs[rt].idmax = segs[rt*2].idmax;
else segs[rt].idmax = segs[rt*2+1].idmax;
if(segs[rt*2].Min < segs[rt*2+1].Min)
segs[rt].idmin = segs[rt*2].idmin;
else segs[rt].idmin = segs[rt*2+1].idmin;
}
void buildtree(int rt,int L,int R){
if(L == R){
segs[rt].val = a[L];
segs[rt].idmax = segs[rt].idmin = L;
segs[rt].Min = segs[rt].Max = a[L];
return;
}
buildtree(lson);
buildtree(rson);
PushUP(rt);
}
int querymin(int rt,int L,int R,int l_ran,int r_ran){
if(l_ran<=L&&R<=r_ran){
return segs[rt].idmin;
}
int id = 0;
if(l_ran <= mid){
id = querymin(lson,l_ran,r_ran);
}
if(r_ran > mid){
int tid = querymin(rson,l_ran,r_ran);
if(id != 0){
if(a[id] > a[tid])
id = tid;
}else{
id = tid;
}
}
return id;
}
int querymax(int rt,int L,int R,int l_ran,int r_ran){
if(l_ran<=L&&R<=r_ran){
return segs[rt].idmax;
}
int id = 0;
if(l_ran <= mid){
id = querymax(lson,l_ran,r_ran);
}
if(r_ran > mid){
int tid = querymax(rson,l_ran,r_ran);
if(id != 0){
if(a[id] < a[tid])
id = tid;
}else{
id = tid;
}
}
return id;
}
void dfs(int l, int r){
if(l > r) return;
int idmin, idmax;
idmin = querymin(1,1,n,l,r);
idmax= querymax(1,1,n,l,r);
if(idmax < idmin)
swap(idmin,idmax);
LL tmp = a[idmax]*a[idmin];
for(int i = idmax-idmin+1; i <= r-l+1; i++){
ans[i] = max(ans[i], tmp);
}
if(a[idmax] > a[idmin]){
dfs(l,idmin-1);
dfs(idmin+1,r);
}else{
dfs(l,idmax-1);
dfs(idmax+1,r);
}
}
int main(){
while(scanf("%d",&n)!=EOF){
LL ret = 0;
for(int i = 1; i <= n; i++){
scanf("%lld",&a[i]);
}
buildtree(1,1,n);
for(int i = 1; i <= n; ++i){
ans[i] = 1;
}
dfs(1,n);
for(int i = 1; i <= n; i++){
printf("%lld\n",ans[i]);
}
}
return 0;
} /*
5
5 1 2 4 4 */
HDU 5696 ——区间的价值——————【线段树、快排思想】的更多相关文章
- HDU 5700 区间交 离线线段树
区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...
- hdu 5696 区间的价值 单调栈+rmq
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- HDU 5696 区间的价值 暴力DFS
Problem Description 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知 ...
- [hdu] 5696 区间的价值 || 序列分治
原题 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 求长度分别为1-n的区间的最大价值. 保证数据随机 因 ...
- HDU 5700 区间交(线段树)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5700 [题目大意] 给出一个长度为n的数列和m个区间,现在求k个区间,使得他们的区间交内的数列项和 ...
- HDU 5696 区间的价值 暴力
分析:枚举以该点为最小值,然后找到最大值,更新,相应数组,至此,把区间分割(因为包含这个最小值点已经枚举过) 然后理解理解,感觉好像挺对的...因为后面(即dfs区间变小时)如果再包含最小值节点,也不 ...
- hdu 5696 区间的价值
套路题 求出来以每个数为最大值/最小值时的一个区间范围, 然后枚举每个数为最大值的情况更新即可, 但是对于重复数的话需要特判一下, 假如用map记录来特判复杂度就是$O(nlogn)$, 不过题目说了 ...
- HDU 5700——区间交——————【线段树+枚举】
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
随机推荐
- php以不同名字下载同一个文件(x-sendfile) 【转】
1.linux 下nginx默认支持x-sendfile模式 Nginx 默认支持该特性,不需要加载额外的模块.需要发送的 HTTP 头为 X-Accel-Redirect.另外,需要在配置文件中做以 ...
- Partition--分区切换
现有数据表[dbo].[staging_TB1_20131018-104722]和分区表[dbo].[TB1],需要将分区表和数据表中做数据交换 CREATE TABLE [dbo].[staging ...
- C#生成二维码(加源码)
使用工具: Visual Studio(VS) 2013 第一步: 要用到一个类:QRCodeEncoder 这个类要添加一个动态库:ThoughtWorks.QRCode.dll(项目中有带) 然后 ...
- 【07】循序渐进学 docker:数据持久化
写在前面的话 学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器.那数据怎么办?岂不删库跑路了? 就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了? D ...
- vm虚拟机Kali无法拖拽文件解决办法
vm虚拟机Kali无法拖拽文件解决办法 apt-get updateapt-get install open-vm-tools-desktop fusereboot
- Zabbix监控详解
Zabbix是什么 Zabbix 是由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持. Zabbix 是一个企业级的分布式开源监控方案. Zabbix是一款能够监控各 ...
- NFS共享服务
一.网络文件系统共享服务 NFS( Network File System,网络文件系统 )是一种基于TCP/IP传输的网络文件系统协议,最初由SUN公司开发,通过使用NFS协议,客户机可以像访问本地 ...
- UIViewContentMode-
图片很小,frame很大 图片很大,frame很小 UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit, UIViewConte ...
- mfix18.1.1的cmake编译相关问题
今天把mfix-18.1.1\model\monitors里的文件拷到当前工作目录,进行修改编译,发现修改后运行发现并没有出现任何修改后的效果,发现这几个文件只有在原始目录里修改的才起作用,拷贝到当前 ...
- vue.js学习笔记(一)——vue-cli项目的目录结构
vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组件和vue生态系 ...