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;
}
posted @ 2021-04-22 23:49  一袭征袍  阅读(168)  评论(0)    收藏  举报