因为 lower_bound(l,r,x,cmp) 其实是在 [l,r) 范围内找到第一个 p 使得 cmp(*p,x) 为 0,所以好像存在这样一个二分的写法:
int p[0];
int ans=lower_bound(p+1,p+(int)(1e8),0,[&](const int&x,const int&y)->bool{return check(&x-p);})-p-1;
虽然我从来没见过这样的写法,但是这么写在洛谷确实可以过题。record。
我查了一下 lower_bound 的定义,但是没怎么懂:
template<typename _ForwardIterator, typename _Tp, typename _Compare>
_GLIBCXX20_CONSTEXPR
_ForwardIterator
__lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val, _Compare __comp)
{
typedef typename iterator_traits<_ForwardIterator>::difference_type
_DistanceType;
_DistanceType __len = std::distance(__first, __last);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__comp(__middle, __val))
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else
__len = __half;
}
return __first;
}
这种写法会不会产生 UB?希望讨论区大佬解释一下。