这题怎么解决TLE

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

ningmengcha @ 2022-07-18 15:35:46

#include<iostream>
#include<algorithm>
using namespace std;
int a[5000001];
void fenzhi(int l,int r){
    if(l>=r){
        return;
    }
    int x=a[(l+r+1)/2]; 
    int i=l-1;
    int j=r+1;
    while(i<j){
        do{
            i++;
        }while(a[i]<x);
        do{
            j--;
        }while(a[j]>x); 
        if(i<j){
            swap(a[i],a[j]);
        }
    }
    fenzhi(l,i-1);
    fenzhi(i,r);
}
int main()
{
    int n;
    cin>>n;
    int m;
    cin>>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    fenzhi(0,n-1);
    cout<<a[m];
    return 0; 
 } 

by JustinXiaoJunyang @ 2022-07-18 15:37:11

O(N) 还可以接受。


by PassName @ 2022-07-18 15:41:16

@ningmengcha 把数组开小,就没有 TLE了


by ningmengcha @ 2022-07-18 16:16:32

@单南松 但是会RE..


by PassName @ 2022-07-18 16:18:01

@ningmengcha 对,解决了TLE 的问题。

当然,也可以选择输出-114514已达到同时解决RE和TLE的问题


by 几何微粒子 @ 2022-08-01 18:53:05

把递归的两行代码改成

if(l<j&&k+1<=j) qsort(l,j);
if(i<r&&i<=k+1) qsort(i,r);

由于要求的只是a[k+1],所以只用对k那一边的数进行排序就可以了。

反正题目没说手段可以多不要脸


|