关于 lower_bound
  • 板块学术版
  • 楼主yanjiadong
  • 当前回复11
  • 已保存回复11
  • 发布时间2025/7/24 09:48
  • 上次更新2025/7/24 14:45:03
查看原帖
关于 lower_bound
715293
yanjiadong楼主2025/7/24 09:48

因为 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?希望讨论区大佬解释一下。

2025/7/24 09:48
加载中...