poj 3264 Balanced Lineup(rmq vs 线段树)

简介:

题目链接:http://poj.org/problem?id=3264

第一次做rmq问题,据说这道题是最简单的rmq问题了。。。题意很简单了,就是给一组数据,随即的求出某个区间内最大数和最小数之差。

查了许多资料,首先rmq原理:用A[1..N]表示一组数,F[I,J]表示从A[I]到A[I+2^J-1]这个范围内的最大值,也就是以A[I]为起点连续2^J个数的最大值,由于元素个数为2^J个,所以从中间平均分成两部分,每一部分的元素个数刚好为2^(J-1)个,整个区间的最大值一定是左右两部分最大值的较大值,满足动态规划的最优原理状态转移方程:F[I,J]=max(F[I,J-1],F[I+2^(J-1),J-1]),边界条件为F[I,0]=A[I],伪代码:

复制代码
for(int i=1;i<=n;i++) 
   f[i,0]:=a[i];

for(int j=1;j<=ln(n)/ln(2);j++)
{
   for(int i=1;i<=n+1-1<<j;j++) 
     f[i,j]=max(f[i,j-1],f[i+1<<(j-1),j-1]);  
};
复制代码

道理很简单,╮(╯▽╰)╭。。。不知道我的代码到底问题出哪里了,第二组数据怎么也过不去,,上网查了各路大神的代码??求指导,求排错。。。。。下边是我的有问题的代码

View Code

 

这时网上找到的的代码,http://www.cnblogs.com/cnjy/archive/2009/08/30/1556566.html

View Code

 

rmq问题的标准解法是O(nlogn)的预处理, O(1)的查询。不过线段树可以实现O(nlogn)的预处理,O(logn)的查询,速度也不错。下边是用线段树写的,效率没有rmq快。
 
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const int MAXNUM = 50005;
int N,Q;//数字个数,和问题个数
int num[MAXNUM];//数据
int maxn,minn;

typedef struct Node
{
    int ld,rd;//左边界、右边界
    Node *lc,*rc;//左孩子,右孩子
    int nmax,nmin;//最大值、最小值
}Node;

Node *root;

//返回较大值
int maxs(int a,int b)
{
    return a>b?a:b;
}
//返回较小值
int mins(int a,int b)
{
    return a>b?b:a;
}
//刚开始这个函数一直内存错误,头疼,调了半天,
//当给孩子节点分配内存时是在递归中分配的,要想使用通过返回值就可以了,
//不然一直内存错误
Node *build_tree(Node *node,int l,int r)
{
    node = (Node *)malloc(sizeof(Node));
    node->ld = l;
    node->rd = r;
    if(l!=r)
    {
        int mid = (l+r)>>1;
        node->lc = build_tree(node->lc,l,mid);
        node->rc = build_tree(node->rc,mid+1,r);
        node->nmax = maxs(node->lc->nmax,node->rc->nmax);
        node->nmin = mins(node->lc->nmin,node->rc->nmin);
    }else
    {
        node->nmax = node->nmin = num[l];
        node->lc = node->rc = NULL;
    }
    return node;
}

void query(Node *node,int l,int r)
{
    //注意判断节点如果为null就直接返回了
    if(node==NULL)return;
    //相当于一个剪枝,如果最小值已经小于这个节点所存储的区间的最小值,
    //且最大值已经小于这个区间的最大值时就没有必要再向下搜索的必要了
    if(minn <= node->nmin && maxn >= node->nmax)
        return;
    if(node->ld == l && node->rd == r)
    {
        maxn = maxs(node->nmax,maxn);
        minn = mins(node->nmin,minn);
    }
    int mid = (node->ld+node->rd)>>1;
    if(mid>r)
    query(node->lc,l,r);
    else if(mid<l)
    query(node->rc,l,r);
    else
    {
        query(node->lc,l,mid);
        query(node->rc,mid+1,r);
    }

}

int main()
{
    int l,r;
    scanf("%d%d",&N,&Q);
    for(int i = 1; i <= N; i++)
    scanf("%d",&num[i]);
    //root->lc = root->rc = NULL;
    root = build_tree(root,1,N);
    while(Q--)
    {
        scanf("%d%d",&l,&r);
        maxn = -1;
        minn = 1000005;
        query(root,l,r);
        printf("%d\n",maxn-minn);
    }
    return 0;
}
复制代码
本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2012/12/27/2835178.html  ,如需转载请自行联系原作者
相关文章
|
人工智能 自然语言处理 开发者
AIGC创作活动 | 跟着UP主秋葉一起部署AI视频生成应用!
本次AI创作活动由 B 站知名 AI Up 主“秋葉aaaki”带您学习在阿里云 模型在线服务(PAI-EAS)中零代码、一键部署基于ComfyUI和Stable Video Diffusion模型的AI视频生成Web应用,快速实现文本生成视频的AI生成解决方案,帮助您完成社交平台短视频内容生成、动画制作等任务。制作上传专属GIF视频,即有机会赢取乐歌M2S台式升降桌、天猫精灵、定制保温杯等好礼!
|
机器学习/深度学习 算法 存储
一文读懂大规模图神经网络平台AliGraph
2019阿里云峰会·上海开发者大会于7月24日盛大开幕,本次峰会与未来世界的开发者们分享开源大数据、IT基础设施云化、数据库、云原生、物联网等领域的技术干货, 共同探讨前沿科技趋势。本文整理自开源大数据专场中阿里巴巴资深技术专家李永先生的精彩演讲,将为大家分享AliGraph:大规模图神经网络平台。
8993 0
|
9月前
|
运维 Kubernetes 调度
《探秘Kubernetes核心:Pod设计理念与调度基石》
Kubernetes作为容器编排领域的事实标准,其核心调度单元Pod在应用运行与管理中占据重要地位。Pod通过封装紧密协作的容器,实现资源共享与生命周期统一管理,贴近应用本质并简化部署运维。作为资源分配与隔离的最佳粒度,Pod适应复杂应用架构,支持弹性伸缩,提升系统性能与可靠性。其设计理念推动了容器编排技术发展,促进了云原生应用普及,对云计算领域影响深远。
270 11
|
11月前
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
763 11
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
【飞天技术沙龙—阿里云金融量化策略回测Workshop】在上海诺亚财富中心正式举行,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。
西门子S7-1200的功能与特点,应用范围有哪些
今天开始我们来学习西门子S7-1200,S7-1200是西门子公司新推出的一款面向离散自动化系统和独立自动化系统的低端PLC。
西门子S7-1200的功能与特点,应用范围有哪些
|
数据库 对象存储 CDN
阿里云网站建设云企业官网收费价格表(首年和续费价格)
阿里云建站云企业官网首年价格包括设计费和SaaS系统年费,第二续费只收取SaaS系统年费。标准版首年4980元、高级版首年6980元、尊贵版9980元首年,第二年续费标准版980元/年、高级版1980元/年、尊贵版2980元/年
2357 0
阿里云网站建设云企业官网收费价格表(首年和续费价格)
|
Ubuntu Windows Python
尝试自己搭一个QQbot
给自己用服务器搭了一个基于OPQBOT框架的QQbot。
582 0
|
存储 监控 NoSQL
基于Tablestore管理海量快递轨迹数据架构实现
对于一个快递公司,在全国范围内有着大量的快递点、快递员、运输车辆以及仓储中心。而快递自产生后,就会在这些地点、人物之间流转。因而,一套完善的快递管理追踪系统是快递公司的重要管理工具; 用户通过平台客户端下单后,产生唯一的快递单号作为唯一身份标识。
12456 1

热门文章

最新文章