描述
数轴上有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 ;
}

quicksort+binarySearch的更多相关文章

  1. 折半查找,binarySearch

    折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务.它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比 ...

  2. 现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码: 3.优缺点分析 1.UML类图 2.源码: package com.bac ...

  3. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  4. Javascript算法系列之快速排序(Quicksort)

    原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...

  5. JavaScript 快速排序(Quicksort)

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  6. QuickSort 快速排序 基于伪代码实现

    本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...

  7. quicksort

    快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...

  8. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  9. JAVA Arrays.binarySearch

    转自:http://blog.csdn.net/somebodydie/article/details/8229343 package com.jaky; import java.util.*; pu ...

随机推荐

  1. 配置opencv

    先把opencv配置起来: 详细参见: http://blog.163.com/chen_dawn/blog/static/1125063201461695238801/ 我的机器的配置方法: 先去环 ...

  2. CI框架中自定义view文件夹位置

    要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...

  3. Flash cs6 如何从FLA 文件导出sound文件

    Flash. How to export sound from the FLA file extract sound from a fla 第一个是图文教程,在下面还有"watch vide ...

  4. 【高级JSE技术】线程池

    引言 线程池是java并发技术中常用的一种,通过缓存线程资源避免了频繁的创建销毁线程带来的额外开销,从而提高性能.JDK中有相应的Executor框架实现,而Spring中也带有线程池的功能.本文将从 ...

  5. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  6. Android调用.net的webservice服务器接收参数为空的情况

    问题描述:安卓开发中,用Android调用.net开发的wenService时候,从Android客户端传递参数到服务器端,服务器端接收为空 解决方法: 1.设置envelope.dotNet = t ...

  7. dll不同的调用方式

    LoadLibrary 一般是动态加载DLL时(你并不需要对应的头文件,和LIB) #pragma comment 一般是静态加载DLL时(对应的头文件.DLL,和LIB缺一不可,并且生产的EXE没有 ...

  8. 第七篇、CSS3新增属性

    <!-- 1.透明度 opacity(设置不透明度):0.2: --rgba --background-color:rgba(255,0,0,0.8); 2.块阴影和圆角阴影 --box-sha ...

  9. unity访问php

    长连接,弱联网.不好意思,这俩不是一个意思. 反过来说,短连接,强联网,是不是有点别扭呢. 你可以不会php,甚至你可以不知道php是干什么的. 百度php安装环境,自行搭建好环境,顺便测试一下.(下 ...

  10. mysql学习笔记4

    用phpmyadmin创建数据库时出现 #1064 - You have an error in your SQL syntax; check the manual that corresponds ...