描述
数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。 输入
第一行包括两个整数:点的总数n,查询的次数m。 第二行包含n个数,为各个点的坐标。 以下m行,各包含两个整数:查询区间的左、右边界a和b。 输出
对每次查询,输出落在闭区间[a, b]内点的个数。 Example
Input Output 限制
≤ n, m ≤ × 对于次查询的区间[a, b],都有a ≤ b 各点的坐标互异 各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数 时间: sec 内存: MB

终于解决了《范围查询》算法这一题了,100分通过,得瑟一下! 经历了55分,45分,0分,runtime error的越改越少的怪圈,在此说下心得:

先scanf再用new来保存数组的输入值long;然后快速排序;

然后用二分查找,分别找左边界,右边界不同的情况

如果左边界为其中某个数a[i],则说明不包含的个数为i

如果右边界为其中某个数a[i],则说明包含的个数为i+1

用右边界包含的个数减去左边界不包含的个数,就是[a,b]内的个数

还有一种情况是边界点不在坐标数组中,也好分析。

找不到那个数,最后一步情况就是low=middle=high,循环退出时是low>high。也可以算出左边不包含和右边包含的数的个数

用的VC6++,个人觉得关键点有: ,scanf, new long[n], quickSort, binarySearch, delete[]

 #include <cstdio>
//#include <stdlib.h>
//二分查找 long binary_search(long* a, long len, long goal);
void quicksort(long *a, long left, long right); //左边界T,右边界F
long binary_search(long* a, long len, long goal, bool t)
{
long low = ;
long high = len - ;
long middle; while(low <= high)
{
middle = (low + high)/;
if(goal == a[middle])
{
return (t ? middle: middle+);
}
else if(goal < a[middle])//在左半边
high = middle - ; else//在右半边
low = middle + ;
}//low>high
if(goal < a[middle])
return middle;
else//if (goal > a[middle])
return middle + ;
} void quicksort(long *a, long left,long right)
{
long i,j,t,temp;
if(left>right)
return; temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i<j)
{
//顺序很重要,要先从右边开始找 小于基数的数
while(a[j]>=temp && i<j)
j--;
//再找左边的大于基数的数
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp; quicksort(a,left,i-);//继续处理左边的,这里是一个递归的过程
quicksort(a,i+,right);//继续处理右边的 ,这里是一个递归的过程
} int main(void)
{
long num, cmd;
long i,ret1,ret2; scanf("%ld %ld",&num,&cmd); //long *n = (long*)malloc(num*4);
long *n = new long[num];
for (i=;i<num;i++)
scanf("%ld ",n+i); //long *src = (long*)malloc(cmd*4);
//long *des = (long*)malloc(cmd*4);
long *src = new long[cmd];
long *des = new long[cmd]; for (i=;i<cmd;i++)
scanf("%ld %ld",src+i,des+i); quicksort(n, , num-); /* for (i=0;i<num;i++)
printf("%d ",n[i]);*/ for (i=;i<cmd;i++)
{
ret1=binary_search(n,num,src[i],true);//find in n[], length num, goal src[i]
ret2=binary_search(n,num,des[i],false);
printf("%ld\n",ret2-ret1);
} delete[] n;
delete[] src;
delete[] des;
return ;
}

最新文章

  1. iOS 获取设备唯一标示符的方法
  2. HttpModule &amp; HttpHandler
  3. xcode 制作静态库.a文件 详解
  4. CSS笔记(九)轮廓
  5. VMware虚拟机升级过程中遇到的一点问题
  6. C#_自动化测试3_controll IE
  7. java中的多线程——进度2
  8. 来自奢侈品行业的CEO能给苹果带来什么?
  9. Jquery 替换全部花括号
  10. 洛谷 P1412 经营与开发
  11. 小米手机与魅族的PK战结果 说明了什么
  12. 简单描述RAID级别:
  13. pom.xml配置文件配置jar(不用记,快速配置)
  14. BZOJ 3261 最大异或和(算竞进阶习题)
  15. 上传文件服务器与web内容服务分离
  16. PreparedStatement setDate setTimestamp ,util.date sql.date区别
  17. Notepadd ++ PluginManager安装
  18. 纯CSS绘制三角形(各种角度)类似于使用字符画法,根据位移不同,也可以使用两个元素画出三角边框
  19. Memcached 查看列出所有key方法
  20. &lt;&lt;高级计算机网络&gt;&gt;(Advaned Computer Networks) 徐恪 徐明伟 陈文龙 马东超

热门文章

  1. smartctl工具应用(转载整理)
  2. Javascript学习总结三(Array对象的用法)
  3. javascript数据结构和算法[转]
  4. 关于java实现同步的方法
  5. B/S的验证控件
  6. Rabbit MQ安装配置及常见问题
  7. Windows Azure入门教学:使用Blob Storage
  8. vs: 编译: 计算机中丢失mspdb100.dll
  9. AppWidgetProvider生命周期
  10. ios 视频音乐播放