【HDU No. 4417】 超级马里奥 Super Mario
创始人
2024-03-16 12:51:21
0

【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

输出:

对每种情况都输出“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
#include
#include//sort 
#include//sqrtusing 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;iint 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;
}

在这里插入图片描述

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...