O(nlogn)都过不了吗???为什么最后一个测试数据超时???

P1923 【深基9.例4】求第 k 小的数

Go_for_itligli666666 @ 2022-04-14 23:49:10

#include<iostream>
using namespace std;
void QuickSort(int a[],int k,int start,int end){
    //cout<<"start="<<start<<"  end="<<end<<endl;
    if(start>=end){
        return;
    }
    else{
        int base=a[(start+end)/2];
        int x=start,y=end;
        while(x<y){
            while(a[y]>base&&y>=x){
                y--;
            }
            while(a[x]<base&&y>=x){
                x++;
            }
            if(y>=x){
                swap(a[x],a[y]);
                y--,x++;
            }
        }
        if(a[x]<base){x++;}
        //cout<<"base="<<base<<"  a["<<k<<"]="<<a[k]<<endl;
        if(k==x){
            return;
        }
        else if(k<x){
            QuickSort(a,k,start,x-1);
        }else{
            QuickSort(a,k,x,end);
        }
    }
}

int main()
{
    int n,k;
    cin>>n>>k;//求n个数字中第k小的数
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    QuickSort(a,k,0,n-1);
    cout<<a[k]<<endl;
    return 0;
}

by syksykCCC @ 2022-04-15 00:11:33

@Go_for_itligli666666 可能因为 std 是 O(n) 的吧(


by 虫洞吞噬者 @ 2022-04-15 00:33:11

5e6的话nlogn铁定超时呀


by 王熙文 @ 2022-04-15 06:14:53

您的做法仿佛是 O(n) 的,即正解,但用 cin 输入导致超时


by Qiaoqia @ 2022-04-15 06:46:05

更正上面一句:但用没关流同步的 std::cin 导致超时。


by Steven_lzx @ 2022-04-15 07:26:58

@Go_for_itligli666666 开 long long?


by Yukinoshita_Yukino @ 2022-04-15 08:31:04

nlogn确实过不了


by Mzk2333 @ 2022-04-15 08:46:42

nlogn TLE两个点


by Mzk2333 @ 2022-04-15 08:49:24

@ZiShan_ O(2log2n),建议另寻他法


by Go_for_itligli666666 @ 2022-04-15 12:35:01

@王熙文 谢谢。把cin改为scanf就过了。 请问为什么用cin会超时呢?


by 王熙文 @ 2022-04-15 12:44:24

@Go_for_itligli666666 cin 速度慢,原理不知道,记住就行了,一般建议都使用 scanf 或者快读


|