用了快排,最后两例TLE,怎么改进,求大神指点

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

qwe1471900575 @ 2021-03-03 20:54:38

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[5000050];
void work(int a[], int l, int r, int u)
{
    if (l == r)
    {
        return;
    }
    int i = l, j = r, t, k = a[(l + r) / 2];
    do
    {
        while (a[i] < k)i++;
        while (a[j] > k)j--;
        if (i <= j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
            i++;
            j--;
        }
    } while (i <= j);
    if (j >= u)work(a, l, j, u);
    else if (i <= u)work(a, i, r, u);
    else work(a, j + 1, i - 1, u);
}
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int l = 0, r = n - 1, u = m;
    work(a, l, r, u);
    cout << a[m];
    return 0;
}

by konjacq @ 2021-03-03 21:06:23

要么写O(n)的正解 要么写块读


by qwe1471900575 @ 2021-03-03 21:34:33

@konjacq

不懂啥是O(n)的正解,块读

(我是cai ji 55555


by Scintilla @ 2021-03-03 21:36:38

建议自学时间复杂度


by HYdroKomide @ 2021-03-03 21:40:42

常数太大,要用quick read快读


by HYdroKomide @ 2021-03-03 21:47:38

@qwe1471900575 或者用桶排序也可


by _LKs @ 2021-03-03 21:56:25

我觉得你可以优化一下,在查到u处于i,j之间的时候就可以直接输出了,因为三个部分不管如何递归只要最后i,j交错就说明中间那个数是处于自己正确的位置的,稍稍改一下就可以AC了

然后快读是个小技巧,就是写一个快速度入函数read代替cin,这样优化。楼主可以自己找找模板,但总归是上一段那个最优吧


by qwe1471900575 @ 2021-03-03 22:12:27

@_LKs

谢谢你


by qwe1471900575 @ 2021-03-03 22:12:46

@Kevin_FOS

多谢


by losloslos @ 2021-03-15 11:36:29

把cin改成scanf就可以了


|