题目: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;
}