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