TopCoder

User's AC Ratio

100.0% (1/1)

Submission's AC Ratio

60.0% (3/5)

Tags

Description

聽說 std::sort() 很快。

但是,快還要更快!

現在給你一個長度為 n 的陣列 a ,你有辦法在 o(nlogn) (嚴格小於 nlogn )的時間內找出 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 排序後的第 m2 項(從 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 個整數 ai 為陣列中的第 i 項。

  • 0<n1.5×107
  • 0k<n
  • 106ai106

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