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
要么写
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就可以了