现在有一个长度为n的有序的序列,m次询问,每次会告诉你一个数字x,让你完成以下两种操作:
1.找到第一个大于等于x的值的下标,如果有多个等于的话找到第一个等于的下标
2.找到第一个大于x的值的下标
如果没有就输出NO,保证序列有序。
#include<stdio.h>
int a[100001];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
{
int x;
scanf("%d",&x);
int low,mid,high;
low=0;
high=n-1;
mid=(low+high)/2;
while(low<high)
{
if(a[mid]<x)
{
low=mid+1;//找大于等于的,那么如果mid小于x的话直接舍去
mid=(low+high)/2;
}
else
{
high=mid;//如果大于等于则保留此mid
mid=(low+high)/2;
}
}
if(a[low]>=x)
printf("%d ",low+1);
else
printf("NO ");
//以下找大于
low=0;
high=n-1;
mid=(low+high)/2;
while(low<high)
{
if(a[mid]<=x)
{
low=mid+1;//同理小于等于直接舍去
mid=(low+high)/2;
}
else
{
high=mid;//大于保留
mid=(low+high)/2;
}
}
if(a[low]>x)
printf("%d\n",low+1);
else
printf("NO\n");
}
}