【Tsinghua OJ】范围查询(Range)问题
【问题描述】
数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。
【输入】
第一行包括两个整数:点的总数n,查询的次数m。
第二行包含n个数,为各个点的坐标。
以下m行,各包含两个整数:查询区间的左、右边界a和b。
【输出】
对每次查询,输出落在闭区间[a, b]内点的个数。
【输入样例】
5 2
1 3 7 9 11
4 6
7 12
【输出样例】
0
3
【限制】
0 ≤ n, m ≤ 5×105
对于次查询的区间[a, b],都有a ≤ b
各点的坐标互异
各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数
时间:2s,内存:256MB
【solution】先不废话,先贴源代码:
#include <stdio.h>
#include <stdlib.h> #define L 500005 int a[L]; int compare(const void *a, const void *b)
{
int *pa = (int*)a;
int *pb = (int*)b;
return (*pa) - (*pb);
} void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
} int find(int begin, int end, int ac)
{
int mid, left = begin, right = end;
while (left <= right)
{
mid = left + ((right - left) >> );
if (a[mid] >= ac) right = mid - ;
else left = mid + ;
}
return left;
} int main()
{
int n, m, i;
scanf("%d %d\n", &n, &m); for (i = ; i < n; i++)
{
scanf("%d", &a[i]);
} //refer to http://www.cnblogs.com/CCBB/archive/2010/01/15/1648827.html
qsort(a, n, sizeof(int), compare); for (i = ; i < m; i++)
{
int l, r, ans, lf, rt;
scanf("%d %d", &l, &r); //make sure l <= r
if (l > r)
{
swap(l, r);
} rt = find(, n - , r);
lf = find(, n - , l);
ans = rt - lf;
if (a[rt] == r) ans++;
if (ans < ) ans = ; printf("%d\n", ans);
}
}
第一感觉都是这道题以前学的时候肯定做过,很简单,看到这个数据规模基本也就确定得用二分查找了。(反正看网上想先维护好线性数组再O(1)的查找是没混过去的)
实际上,二分查找并没有看起来那么简单,尤其是具体写起来的时候,有很多细节与临界点的处理都得根据实际情况仔细斟酌。
结合上述源代码,有几点值得注意的地方:
1)qsort的用法,参考了:http://www.cnblogs.com/CCBB/archive/2010/01/15/1648827.html。 Tsinghua OJ 不支持 algorithm 库。
2)倒数第三行代码(if (a[rt] == r) ans++;)实际上就是二分查找结合具体情况对答案的调整。不妨分上界和下界等于或者不等于a数组中的值分情况讨论,即可明白这一行的涵义。这也跟二分查找几个细节的处理相统一。
3)二分查找函数中这一行:mid = left + ((right - left) >> 1);。一方面,位运算提高运算效率;另一方面,不直接用 (left + right) >> 1 防止计算过程中数字越界,进而导致数组下标越界。
4)二分查找不要用递归形式。一是提高效率;二是防止堆栈溢出。
【Tsinghua OJ】范围查询(Range)问题的更多相关文章
- 【Tsinghua OJ】灯塔(LightHouse)问题
描述 海上有许多灯塔,为过路船只照明.从平面上看,海域范围是[1, 10^8] × [1, 10^8] . (图一) 如图一所示,每个灯塔都配有一盏探照灯,照亮其东北.西南两个对顶的直角区域.探照灯的 ...
- 【Tsinghua OJ】祖玛(Zuma)问题
描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色.此后,你可以发射珠子到轨 道上并加入原有序列中.一旦有三个或更多同色的珠子变成相 ...
- 【Tsinghua OJ】隧道(Tunel)问题
描述 现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车 该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少 现在请你维护这条隧道的车辆进出记 ...
- 【Tsinghua OJ】多米诺骨牌(domino)问题
(domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...
- 【Tsinghua OJ】循环移位(Cycle)
Description Cycle shifting refers to following operation on the sting. Moving first letter to the en ...
- Tsinghua OJ Zuma
Description Let's play the game Zuma! There are a sequence of beads on a track at the right beginnin ...
- MySQL查询分析器EXPLAIN或DESC
转载:http://chenzehe.iteye.com/blog/1682081 MySQL可以通过EXPLAIN或DESC来查看并分析SQL语句的执行情况,如下需要计算2006年所有公司的销售额, ...
- 利用kibana插件对Elasticsearch查询
利用kibana插件对Elasticsearch查询 Elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据. 查询分类: 基本查询:使用Elasticsear ...
- 七、Django模型基础第二节——常用查询
1 常用的模型字段类型 官方文档链接: https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 常用的字段类型 模型字 ...
随机推荐
- jq 中each的用法
jQuery的each方法的几种常用的用法 each()方法能使DOM循环结构简洁,可遍历一维数组.多维数组.DOM, JSON 等等. var arr = [ "one", &q ...
- IO流--切割 合并文件
import java.io.*; import java.util.*; public class io { public static void main(String[] args)throws ...
- android:exported
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互.如果设置为true,则能够被调用或交互,否则不能.设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定 ...
- Redis 学习资料整理
菜鸟爬坑--Redis学习与探索(二):Redis的数据类型 http://www.cnblogs.com/codediary/archive/2015/02/20/redisstudy-2.html ...
- Anysys Fluent安装教程
按顺序按照在一个文件夹内D:\Anysys Fluent 1:安装Exceed 调整电脑时间至2005年(前辈经验) 点击解压好的Exceed.13.[x86+x64]文件夹中的M ...
- backbonejs mvc框架的增删查改实例
一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...
- jupyter
Pip install jupyter To run: jupyter notebook 基本操作 执行当前cell,并自动跳到下一个cell:Shift Enter 执行当前cell,执 ...
- 我们无法找到服务器加载工作簿的数据模型"的 SharePoint 网站,当您刷新 Excel 2013 工作簿中的数据透视表时出错
假定您使用 Analysis Services 源在 Microsoft Excel 2013 中创建数据透视表.将 Excel 工作簿上载到 Microsoft SharePoint 网站中.当您尝 ...
- 第四章 CSS基础
1.CSS是cascading style sheets 层叠样式表.样式定义如何显示html元素,通常存储在样式表中,将样式添加到html中,是为了解决内容与表现分离的问题. 2.外部样式表可以极大 ...
- L1 - 运行机制
var name = 'kl'; function person(){ alert(name); var name = 'ko'; } person(); 这段代码输出 ‘undefined’,这种现 ...