Brilliant11001 @ 2024-11-01 19:15:45
主要是推式子的时候反了一下
bool operator< (const node &o) const{
return (ll)c * o.b < (ll)o.c * b;
}
这么写 #20 不会 RE。
bool operator< (const node &o) const{
return (ll)o.c * b >= (ll)c * o.b;
}
这么写就 RE 了,数组开多大都没用。
请问这是为什么呢?
by Hagasei @ 2024-11-01 19:19:07
sort(或大多数 STL)要求的小于都是严格小于,也就是不能同时成立 a<b
和 b<a
。你这个显然不严格。
by Hagasei @ 2024-11-01 19:19:14
@Brilliant11001
by liangbowen @ 2024-11-01 19:20:03
cmp(x,y)
,或者你的重载同理,需要满足 cmp(x,y)!=cmp(y,x)
by Brilliant11001 @ 2024-11-01 19:21:10
@Hagasei @Hagasei 感谢,已关
by Hagasei @ 2024-11-01 19:21:11
@liangbowen 你说的错。他们可以同时为零。
by Brilliant11001 @ 2024-11-01 19:21:23
@liangbowen
by liangbowen @ 2024-11-01 19:22:04
哦哦,确实 /kel
by Terrible @ 2024-11-01 19:24:08
并不是重载运算符函数的问题哦,可能只是不匹配。
严格地说,std::sort
等的比较谓词需要满足严格弱序,详见比较 (Compare)
当然某些情况下不满足严格弱序可能也能得出结果,不乏有以下几种情况:
虽然该比较谓词无法提供给待比较集合完整的比较意义,但是能给程序执行时提供涉及的情况提供完整的比较意义。
由于函数、容器等的具体实现和具体数据结合,没有产生严重错误,并且执行结果正确。
该函数、容器等明确地不需要严格弱序。
在有明确要求比较谓词满足严格弱序的前提下,做出比较谓词不满足严格弱序的行为是冒险的,可能触及未定义行为。应当避免这种写法,即便这有时候看起来没有问题。
by StarPatrick @ 2024-11-01 19:33:29
@Terrible 你这段话不就是想表达重载严格小于吗
by Terrible @ 2024-11-01 19:40:16
@StarPatrick 您看上具体哪里的错误了?