MC_xjhjdA @ 2024-06-12 16:19:10
a,b=map(int,input().split())
l=list(map(int,input().split()))
i=list(map(int,input().split()))
for x in i:
low=0
high=len(l)-1
while low<=high:
mid=(low+high)//2
if l[mid]==x:
while l[mid-1]==x:
mid-=1
print(mid+1,end=' ')
break
elif l[mid]>x:
high=mid-1
elif l[mid]<x:
low=mid+1
if l[mid]!=x:
print(-1,end=' ')
by dry_ @ 2024-06-12 16:28:30
python本来就会慢一些,吧。。。
by Terrible @ 2024-06-12 16:39:30
@MC_xjhjdA 你这个写成 C 语言也不过啊,方法出问题了。
你把中间那个 while l[mid-1]==x:mid-=1
这个东西都不是二分了,是线性枚举,想办法去掉它。
你可以看看这个,虽然附上的代码是 C++
也可以使用标准模块中的二分模块,在网上搜搜 bisect
:
import bisect
n,m=map(int,input().split())
l=list(map(int,input().split()))
for x in map(int,input().split()):
p=bisect.bisect_left(l,x)
#p==n 就是找到末尾了
if p==n or l[p]!=x:print(-1,end=' ')
else:print(p+1,end=' ')
# l 下标从 0 开始,题目是下标 1 开始
by MC_xjhjdA @ 2024-06-12 16:51:31
@Terrible 谢谢,解决了