清华OJ:PA1-1 范围查询(Range)

题目:https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1142

代码:

#include<cstdio>
#define MAXSIZE 500000
using namespace std;
int *b=new int[MAXSIZE];
int BinarySearch(int *a,int lo,int hi,int e)
{
	while(lo<hi)
	{
		int mi=(lo+hi)>>1;
		e<a[mi]?hi=mi:lo=mi+1;
	}
	return --lo;//lo为大于e的最小秩,lo-1为不大于e的最大秩
}
void Merge(int *elem,int lo,int mi,int hi)
{
	int *a=elem+lo;
	int lb=mi-lo;
	for(int i=0;i<lb;b[i]=a[i++]);
	int *c=elem+mi;
	int lc=hi-mi;
	for(int i=0,j=0,k=0;j<lb||k<lc;)
	{
		if(j<lb&&(lc<=k||b[j]<=c[k]))a[i++]=b[j++];
		if(k<lc&&(lb<=j||c[k]<b[j]))a[i++]=c[k++];
	}
}
void MergeSort(int *elem,int lo,int hi)
{
	if(lo+1<hi)
	{
		int mi=(lo+hi)>>1;
		MergeSort(elem,lo,mi);
		MergeSort(elem,mi,hi);
		Merge(elem,lo,mi,hi);
	}
}
int main()
{//注意,索引皆从0开始,排序,查找区间为左闭右开 
	int m,n;
	scanf("%d%d",&n,&m);
	int *a=new int[n];
	for(int i=0;i<n;i++)
	scanf("%d",&a[i]);
	MergeSort(a,0,n);//数据可能乱序,先排序 
	int n1,n2;
	while(m--)
	{ 
		scanf("%d%d",&n1,&n2);
		int lborder=BinarySearch(a,0,n,n1);//获得左边界索引 
		int rborder=BinarySearch(a,0,n,n2);//获得右边界索引 
		int delta=rborder-lborder;//计算差值 
		if(lborder<0)//若输入左边界小于首元素,获得左边界索引-1 
		delta=rborder+1;//差值为右边界索引+1 
		else if(a[lborder]==n1)//若左边界刚好是输入左边界,注意使用else if 
		delta++;//差值+1 
		printf("%d\n",delta);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/82597987