【HDU No. 4417】 超级马里奥 Super Mario

news2024/11/15 16:53:03

【HDU No. 4417】 超级马里奥 Super Mario

杭电OJ 题目地址

在这里插入图片描述

【题意】

可怜的公主陷入困境,马里奥需要拯救他的情人。把通往城堡的道路视为一条线(长度为n ),在每个整数点i 上都有一块高度为hi 的砖,马里奥可以跳的最大高度是H ,求他在[L , R ]区间可以跳过多少砖块。

【输入输出】

输入:

第1行是整数T,表示测试用例的数量。每个测试用例的第1行都包含两个整数n、m (1≤n ,m ≤10^5 ),n 是道路的长度,m 是查询的数量。下一行包含n 个整数,表示每个砖的高度(范围是[0,10^9 ])。接下来的m 行,每行都包含三个整数L 、R 、H (0≤L ≤R<n ,0≤H ≤10^9 )。

输出:

对每种情况都输出“Case X :”(X 是从1开始的案例编号),后跟m 行,每行都包含一个整数。第i 个整数是第i 个查询中马里奥跳过的砖块数。

【样例】

在这里插入图片描述

【思路分析】

这道题也是区间查询问题,查询[l , r ]区间小于或等于h 的元素个数,可以采用分块的方法解决。

【算法设计】

① 分块。划分块并对每一块进行非递减排序。在辅助数组temp[]上排序,原数组不变。

② 查询。查询[l , r ]区间小于或等于h 的元素个数。

  • 若该区间属于同一块,则暴力累加块内小于或等于h 的元素个数。
  • 若该区间包含多个块,则累加中间每一块小于或等于h 的元素个数,此时可以用upper_bound()函数统计,然后暴力累加左端和右端小于或等于h 的元素个数。

【举个栗子】

根据测试用例的输入数据,分块算法的求解过程如下。

① 分块。n =10,t = √n =3,每3个元素为一块,一共分为4块,最后一块只有一个元素。原数组a []和每一块排序后的辅助数组temp[]如下图所示。

在这里插入图片描述

② 查询。1 9 4:因为题目中的下标从0开始,上图中的下标从1开始,所以实际上是查询[2, 10]区间高度小于或等于4的元素个数。[2, 10]区间跨4个块,左端第1个块没有完全包含,需要暴力统计a[2]、a [3]小于或等于4的元素。

后面3个块是完整的块,对完整的块可以直接用upper_bound()函数在temp数组中统计,该函数利用有序性进行二分查找,效率较高。

在这里插入图片描述

【算法实现】

upper_bound( begin, end, num):从数组的begin位置到end-1位置二分查找第1个大于num的数字,若找到,则返回该数字的地址,否则返回end。将返回的地址减去起始地址begin,即可得到小于或等于num的元素个数。

#include<cstdio>
#include<cstring>
#include<algorithm>//sort 
#include<cmath>//sqrt

using namespace std;

const int maxn=1e5+10;
int L[maxn],R[maxn],belong[maxn];
int a[maxn],temp[maxn],n,m;

void build(){
    int t=sqrt(n);
    int num=n/t;
	if(n%num) num++;
    for(int i=1;i<=num;i++)
        L[i]=(i-1)*t+1,R[i]=i*t;
    R[num]=n;
    for(int i=1;i<=n;i++)
        belong[i]=(i-1)/t+1;
    for(int i=1;i<=num;i++)
        sort(temp+L[i],temp+1+R[i]);//每块排序
}

int query(int l,int r,int h){
    int ans=0;
    if(belong[l]==belong[r]){
        for(int i=l;i<=r;i++)
            if(a[i]<=h) ans++;
    }
    else{
        for(int i=l;i<=R[belong[l]];i++)//左端 
            if(a[i]<=h) ans++;
        for(int i=belong[l]+1;i<belong[r];i++)//中间 
            ans+=upper_bound(temp+L[i],temp+R[i]+1,h)-temp-L[i];
        for(int i=L[belong[r]];i<=r;i++)//右端 
            if(a[i]<=h) ans++;
    }
    return ans;
}

int main(){
	
    int T;
    scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            temp[i]=a[i];
        }
        build();
        printf("Case %d:\n",cas);
        while(m--){
            int l,r,h; 
            scanf("%d%d%d",&l,&r,&h);
            printf("%d\n",query(++l,++r,h));
        }
    }
	
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客552】git auto-merge原理以及auto-merge的不同模式

git auto-merge原理 1、merge 常见误区 1、git merge 是用时间先后决定merge结果的&#xff0c;后面会覆盖前面的? 答 &#xff1a;git 是分布式的文件版本控制系统&#xff0c;在分布式环境中时间是不可靠的&#xff0c;git是靠三路合并算法进行合并的。 2、git merge 只…

电脑装了w10没有w7流畅怎么办?

如果我们对自己的电脑进行了系统的重装&#xff0c;在电脑装了win10系统之后发现没有win7流畅的话&#xff0c;很多小伙伴不知道是什么情况应该怎么解决。 那么据微点阅读小编所知可能是我们电脑硬件设施的不兼容所导致的。我们可以在官网上查看win10系统的配置要求是否符合自…

一文带你深入理解【Java基础】· 泛型

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Arduino开发实例-DIY风速测量及显示

DIY风速测量及显示 1、应用介绍 本次实例将使用一款具有 NPN 脉冲输出的数字风速计传感器。 NPN脉冲输出风速计效果好,性价比高。另外它仅在 5V 电源下工作。 在本次实例中,将此风速计传感器与 Arduino 板和 0.96 英寸 OLED 显示屏连接。 OLED显示屏将以米/秒为单位显示风速…

[附源码]计算机毕业设计基于SpringBoot的酒店预订系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

​AAAI 2023 | 基于历史对比学习的时序知识图谱推理

©PaperWeekly 原创 作者 | 徐奕单位 | 上海交通大学Acemap研究方向 | 数据挖掘论文标题&#xff1a;Temporal Knowledge Graph Reasoning with Historical Contrastive Learning论文链接&#xff1a;https://arxiv.org/abs/2211.10904代码链接&#xff1a;https://github…

Elasticsearch好用查询插件分享

以前我常用的ES查询工具是Head&#xff0c;作为插件形式在浏览器中运行&#xff0c;挺方便的&#xff0c;后来发现head不太好用&#xff0c;比如在数据浏览的时候&#xff0c;不小心就点击了两个索引&#xff0c;背景色设置的还不够明显&#xff0c;比较容易看错数据的。于是想…

git中rebase和merge的区别

介绍 Merge和Rebase是合并两个分支的操作。都是checkout到某个分支上&#xff0c;然后将别的分支合并&#xff08;变基&#xff09;到本分支上。 注意&#xff1a;本分支&#xff08;head指向的分支&#xff0c;或者经过checkout后的分支&#xff09;会变化&#xff0c;而别的…

在Linux上部署Servlet程序

目录 一、部署环境 1、安装JDK 2、安装Tomcat 3、安装MySQL 二、部署程序 1、构造云服务器上的数据库 2、打包程序 3、部署程序 一、部署环境 为了部署我们自己的web程序&#xff0c;首先需要在Linux上安装程序所依赖的环境~ 1、安装JDK 直接使用yum安装openjdk&…

小程序云开发笔记二

小程序云开发笔记二一、读取数据库播放列表将数据显示到界面二、上拉加载三、上拉刷新四、云函数路由优化tcb-router案例&#xff1a;点击两个按钮调用同一个云函数将music中写成koa风格的云函数五、事件冒泡组件参数properties和data一、读取数据库播放列表将数据显示到界面 …

java同步方法

观看此文 首先 你要了解 java的同步锁 如果不了解 可以观看我的文章 java 同步锁synchronized 解决线程共享数据重复操作问题 那么 从下图 我们可以看到 逻辑代码上被绑了一个同步锁 但这个其实大可以写成一个函数 看起来会美观便捷很多 同步方法的格式如下 修饰符 synchro…

git switch 命令详解

1. 前言 2. switch 创建分支 3. switch 切换分支 1. 前言 checkout 命令具有 分支的管理 和 文件的恢复 两个核心功能&#xff0c;功能较多、不够准确。在 git 2.23 版本中新增了 switch 和 restore命令&#xff0c;用于替代 checkout 命令&#xff0c;进而分化 checkout 命…

(附源码)springboot大学生竞赛管理平台 毕业设计

题 目 springboot大学生竞赛管理平台 目 录 摘要 1 1 绪论 1 1.1选题意义 1 1.2国内外研究现状 1 1.3系统开发技术的特色 4 1.4论文结构与章节安排 4 2 大学生竞赛管理平台分析 5 2.1 可行性分析 5 2.2 系统流程分析 6 2.2.1数据增加流程 7 2.3.2数据修改流程 7 2.3.3数据删…

java面向对象----封装 构造器

目录 封装和隐藏 为什么需要封装&#xff1f; 信息的封装和隐藏 四种访问权限修饰符 构造器(构造方法) 构造器的特征 语法格式&#xff1a; 构造器重载 构造器重载举例 属性赋值过程 JavaBean UML类图 关键字—this this是什么&#xff1f; 使用this&#xff0c;…

计算机网络笔记2 物理层

计算机网络系列笔记目录&#x1f447; 计算机网络笔记6 应用层计算机网络笔记5 运输层计算机网络笔记4 网络层计算机网络笔记3 数据链路层计算机网络笔记2 物理层计算机网络笔记1 概述 本文目录文章前言 &#x1f497;一、物理层概述&#x1f60a;二、物理层的传输媒体&#x…

Spring源码该如何阅读?十年架构师带来的Spring源码解析千万不要错过!

写在前面 最近学习了一句话&#xff0c;感觉自己的世界瞬间明朗&#xff0c;不再那么紧张焦虑恐慌&#xff0c;同样推荐给大家&#xff0c;希望我们都终有所得。 “如果一个人不是发自内心地想要做一件事情&#xff0c;那么&#xff0c;他是无法改变自己的人生的。” 同样这句…

4. 死信队列

二八佳人体似酥&#xff0c;腰间仗剑斩愚夫。虽然不见人头落&#xff0c;暗里教君骨髓枯。 死信 概念 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理 解&#xff0c;一般来说&#xff0c;producer 将…

「Redis」05 Jedis操作Redis

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——Jedis操作Redis 即通过 Java 操作 Redis。 1. Jedis基本操作 Ⅰ. 测试连接 连接Redis注意事项 禁用Linux的防火墙&#xff1a;Linux&#xff08;CentOS7&#xff09;里执行命令&#xff1a;systemctl stop/disab…

我的周刊(第068期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目osquery[1]像操作 SQL 一样操作你的电脑&#xff0c…

康复训练的未来:VR和元宇宙如何帮助患者康复

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;7分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 一位有平衡问题的患者站在波速球上&#xff0c;同时在两只潇洒的企鹅之间击打着…