P2249 【深基13.例1】查找 踩坑记录
P2249 【深基13.例1】查找 踩坑记录
本来闲来无事,手写个二分板子玩,结果各种wa和t,所以大概记录一下踩了哪些坑。
1、查找第一次出现的位置
按理说,找到位置,然后如果前面的值与查找值一往前找就完事了,结果有一组数据,n个数都是一样的,也就是说找到的mid为n/2,那么m组的复杂度就是n*m/2。然后就TLE了。然后我还没想到什么好办法可以直接解决。所以在--之前,去前方二分之一的位置看是否为查找值,如果是,说明这一段都是这个值,从二分之一的位置开始找,只要二分之一的位置为查找值,且位置不为0,一直二分。
2、查找数值为0时的数组越界问题
习惯性设置全局变量,想着反正自动初始化,没想到出数据的人会查找0,而且还是多个重复的0,导致如果一直往前找不一样的数值,没有设置边界就会越界。
总结一下
本来这些也没啥可说的,就是被坑了很不爽,记录一下,下次提高警惕。
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+7;
const int inf=1e9+7;
int a[N],n,m,x;
int lowerbound(int t,int st,int ed){
int l=st,r=ed;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]==t){
while((a[mid/2]==t)&&mid)
mid/=2;
while(a[mid-1]==t)
mid--;
return mid;
}
if(a[mid]>t)
r=mid-1;
if(a[mid]<t)
l=mid+1;
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
a[0]=-inf;
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=0;i<m;++i){
scanf("%d",&x);
printf("%d ",lowerbound(x,1,n));
}
return 0;
}

浙公网安备 33010602011771号