输入一个长度为n的整数数列,从小到大输出前m小的数。
输入格式
第一行包含整数n和m。
第二行包含n个整数,表示整数数列。
输出格式
共一行,包含m个整数,表示整数数列中前m小的数。
数据范围
1 ≤ m ≤ n ≤ 10^5,
1 ≤ 数列中元素 ≤ 10^9
输入样例
输出样例
模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <iostream> #include <algorithm>
using namespace std;
const int N =100010;
int n, m; int h[N], Size;
void down(int u) { int t = u; if(2 * u <= Size && h[u * 2] < h[t]) t = 2 * u; if(2 * u + 1 <= Size && h[2 * u + 1] < h[t]) t = 2 * u + 1; if(t != u) { swap(h[t], h[u]); down(t); } }
void up(int u) { while( u / 2 && h[u / 2] > h[u]) { swap(h[u / 2], h[u]); u /= 2; } }
int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) scanf("%d", &h[i]); Size = n; for(int i = n / 2; i; i --) down(i); while(m --) { printf("%d ", h[1]); h[1] = h[Size]; Size --; down(1); } return 0; }
|