std::sort 的注意事项

Luogu P1177 【模板】快速排序

\(\Large{AC}\) 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010]; 
bool cmp(int x,int y){
    return x<y;
}
signed main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++) cout<<a[i]<<("\n "[i!=n-1]);
    return 0;
}

\(\Large{TLE}\) 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010]; 
bool cmp(int x,int y){
    return x<=y;
}
signed main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++) cout<<a[i]<<("\n "[i!=n-1]);
    return 0;
}

有木有发现就是第 \(5\) 行的 <<= 的区别...

这是由于 std::sortcmp(x,y) 类似于:

现在 xy 后(右)边,cmp 返回 x 是否应该超到 y 的前(左)边。

那为什么 <= 会 \(\Large{TLE}\) 呢?

由于 std::sort 中的某些蜜汁操作,当有两个值相同的元素 \(x,y\) 时,程序里会反复交换 \(x,y\),导致 \(\Large{TLE}\)。

所以啊,

std::sortcmp 时,若两个元素判定为相同的,请务必输出

\[\Large{False} \]

上一篇:算法第四版- 2.3


下一篇:【解题报告】洛谷P4653 [CEOI2017]Sure Bet