TopCoder

User's AC Ratio

100.0% (1/1)

Submission's AC Ratio

60.0% (3/5)

Tags

Description

聽說 std::sort() 很快。

但是,快還要更快!

現在給你一個長度為 $n$ 的陣列 $a$ ,你有辦法在 $o(n \log n)$ (嚴格小於 $n \log n$ )的時間內找出 $a$ 的第 $k$ 大嗎?


本題為一道互動題。在這個問題中,你需要和評測系統進行互動。

一開始電腦會產生一個長度為 $n$ 的陣列 $a$ 及一個非負整數 $k$ ,並呼叫 int solve(int n, int a[], int k) ,你要實作這個函式,並使其回傳 $a$ 排序後的第 $k$ 項(從 $0$ 開始編號)。例如 $n = 5, a = [3, 1, 4, 1, 5], k = 2$ ,則需回傳 $3$ 。

你可以呼叫 int median(int b[], int m) 這個函式,其中 $m$ 為陣列 $b$ 的長度。他會回傳 $b$ 排序後的第 $\lfloor \frac{m}{2} \rfloor$ 項(從 $0$ 開始編號)。


實作細節

請在程式一開始引入標頭檔 lib0614.h。並實做下列函式,回傳陣列 $a$ 中第 $k$ 大的數字。

  • int solve(int n, int a[], int k):
    • n:代表陣列長度。
    • a:陣列本身。
    • k:你要找的第 $k$ 大。

Input Format

輸入分為兩行。

第一行有兩個正整數 $n, k$,兩者以空白分隔,即為題目所述之 $n, k$。

第二行有 $n$ 個整數,第 $i$ 個整數 $a_i$ 為陣列中的第 $i$ 項。

  • $0 < n \le 1.5 \times 10^ 7$
  • $0 \le k < n$
  • $-10^ 6 \le a_i \le 10^ 6$

Output Format

輸出一個整數,代表陣列 $a$ 中第 $k$ 大的數字 (從 0 開始計算)。

Sample Input 1

5 2
2 8 8 10 8

Sample Output 1

8

Sample Input 2

5 0
-19 12 -9 7 9

Sample Output 2

-19

Hints

測試用標頭檔
這裡提供一份本地測試用的標頭檔,你可以將其複製下來存檔成 lib0614.h#include "lib0614.h" 做使用。但請注意,這只是測試用的標頭檔,一些與解題無關的行為將會與 judge 上的有所不同,因此請不要嘗試任何與解題無關的行為,很可能會導致各種不可預期的後果。

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0~1 範例測資 0
2 0~18 無額外限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1200 524288 65536 1 2
1 1200 524288 65536 1 2
2 1200 524288 65536 2
3 1200 524288 65536 2
4 1200 524288 65536 2
5 1200 524288 65536 2
6 1200 524288 65536 2
7 1200 524288 65536 2
8 1200 524288 65536 2
9 1200 524288 65536 2
10 1200 524288 65536 2
11 1200 524288 65536 2
12 1200 524288 65536 2
13 1200 524288 65536 2
14 1200 524288 65536 2
15 1200 524288 65536 2
16 1200 524288 65536 2
17 1200 524288 65536 2
18 1200 524288 65536 2