一题简单的数据结构,求助
描述:数轴上有n个点,对于任一闭区间[a,b],试计算落在其内的点数。输入:第一行包括两个整数:点的总数n,查询的次数m。第二行包含n个数,为各个点的坐标。以下m行,各包...
描述:
数轴上有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×10^5
对于次查询的区间[a, b],都有a ≤ b
各点的坐标互异
各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数
时间:2s,内存:256MB
以下我的代码,【OJ上的20个测试点过了17个,另外3个显示答案错误】
但是我找不出为什么。
#include <cstdio>
#include <cstdlib>
#define num 500001
int search(int lo, int hi, int x, int a[]);
void sort(int a[], int lo, int hi);
int main()
{
int query,count[num+1]={},pointnum,point[num+1],region[num+1][2];//分别是查询次数,计数器,点的个数,储存点坐标的数组,储存区间坐标的数组
int i;
scanf("%d%d",&pointnum,&query);
//接受数组
for(i=0;i<pointnum;i++)
scanf("%d",&point[i]);
//接受查询区间
for(i=0;i<query;i++)
scanf("%d%d",®ion[i][0],®ion[i][1]);
//快排
sort(point,0,pointnum-1);
//计数
for(i=0;i<query;i++)
{
if(region[i][0]>point[pointnum-1]||region[i][1]<point[0])
count[i]=0;
else
{
int a=search(0,pointnum,region[i][0],point);
int b=search(a,pointnum,region[i][1],point);
count[i]=b-a;
if(point[a]==region[i][0])//如果左边界恰好在数组中,计数器加一
count[i]++;
}
}
//输出
for(i=0;i<query;i++)
printf("%d\n",count[i]);
system("pause");
return 0;
}
//二分查找
int search(int lo, int hi, int x, int a[])
{
while(lo<hi)
{
int mi=lo+((hi-lo)>>1);
(x<a[mi])?hi=mi:lo=mi+1;
}
lo=lo-1;
return (lo);//返回不大于X的元素的最大者的下标
}
//快排
void sort(int a[],int lo, int hi)
{
if (lo<hi)
{
int i=lo,j=hi, x=a[lo];
while (i<j)
{
while(i<j&&a[j]>=x)
j--;
if(i<j)
a[i++] = a[j];
while(i<j && a[i]< x)
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
sort(a,lo,i-1);
sort(a,i+1,hi);
}
}
想问问我到底遗漏了什么情况?毕竟17组都通过了…… 展开
数轴上有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×10^5
对于次查询的区间[a, b],都有a ≤ b
各点的坐标互异
各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数
时间:2s,内存:256MB
以下我的代码,【OJ上的20个测试点过了17个,另外3个显示答案错误】
但是我找不出为什么。
#include <cstdio>
#include <cstdlib>
#define num 500001
int search(int lo, int hi, int x, int a[]);
void sort(int a[], int lo, int hi);
int main()
{
int query,count[num+1]={},pointnum,point[num+1],region[num+1][2];//分别是查询次数,计数器,点的个数,储存点坐标的数组,储存区间坐标的数组
int i;
scanf("%d%d",&pointnum,&query);
//接受数组
for(i=0;i<pointnum;i++)
scanf("%d",&point[i]);
//接受查询区间
for(i=0;i<query;i++)
scanf("%d%d",®ion[i][0],®ion[i][1]);
//快排
sort(point,0,pointnum-1);
//计数
for(i=0;i<query;i++)
{
if(region[i][0]>point[pointnum-1]||region[i][1]<point[0])
count[i]=0;
else
{
int a=search(0,pointnum,region[i][0],point);
int b=search(a,pointnum,region[i][1],point);
count[i]=b-a;
if(point[a]==region[i][0])//如果左边界恰好在数组中,计数器加一
count[i]++;
}
}
//输出
for(i=0;i<query;i++)
printf("%d\n",count[i]);
system("pause");
return 0;
}
//二分查找
int search(int lo, int hi, int x, int a[])
{
while(lo<hi)
{
int mi=lo+((hi-lo)>>1);
(x<a[mi])?hi=mi:lo=mi+1;
}
lo=lo-1;
return (lo);//返回不大于X的元素的最大者的下标
}
//快排
void sort(int a[],int lo, int hi)
{
if (lo<hi)
{
int i=lo,j=hi, x=a[lo];
while (i<j)
{
while(i<j&&a[j]>=x)
j--;
if(i<j)
a[i++] = a[j];
while(i<j && a[i]< x)
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
sort(a,lo,i-1);
sort(a,i+1,hi);
}
}
想问问我到底遗漏了什么情况?毕竟17组都通过了…… 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询