std::set::lower_bound与std::lower_bound的效率问题
lower_bound是大家很常使用的函数,但是在对容器使用时,尽量使用容器本身的lower_bound / upper_bound.std::set::lower_bound与std::lower_bound的效率问题这个问题可能大家觉得只差那么一点点,恰恰相反,两者效率相差大的几乎是天壤之别。在最近的cf round359(div2)的D题里,我和标程解法一模一样,但是一个是700msAC但是
·
lower_bound是大家很常使用的函数,但是在对容器使用时,尽量使用容器本身的lower_bound / upper_bound.
std::set::lower_bound与std::lower_bound的效率问题
这个问题可能大家觉得只差那么一点点,恰恰相反,两者效率相差大的几乎是天壤之别。
在最近的cf round359(div2)的D题里,我和标程解法一模一样,但是一个是700msAC但是我的程序却是3000ms,默默的TLE。 完全不科学。
经过仔细比对,我的程序里面二分是这样的:
但是标程是这样的:
完全难以相信他俩有任何区别。
我修改之后再次将我的程序提交:
果然是这个问题!
这个问题很困扰我,cppreference网站上并没有解释。某度上也搜不到任何信息。
所以上StackOverflow上搜了一下,果然有这个问题。
WOW这个就是我想问的,下面是回答:
我倒是觉得下面那个说的很有道理,应该是set<>::iterator不支持随机访问,所以直接当作普通的序列进行二分的时候就不是O(logn)的复杂度了。
所以,一定要使用std::set::lower_bound
更多推荐
已为社区贡献1条内容
所有评论(0)