列表

详情


NC214362. 第k小

描述

有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4  6 中,第 3 小的数就是2.
牛牛觉得这个游戏太简单了,想加一点难度,现在牛牛有 m 个操作,每个操作有两种类型。
1 x  1 代表操作一,给数组中加一个元素 x 。(0 ≤ x ≤ 1e9)
2     2 代表操作二,查询第 k 小的数。如果没有 k 个数就输出−1

输入描述

第一行有三个整数,n m k,(1≤n,m,k≤2e5)
第二行包含 n 个整数 a[i] ( 0 ≤ a[i] ≤ 1e9)
接下来m行,每行代表一个操作。具体见题目描述

输出描述

每次查询输出一个第 k 小的数。


示例1

输入:

5 4 3
1 2 3 4 5
2
1 1
1 3
2

输出:

3
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 235ms, 内存消耗: 5148K, 提交时间: 2022-06-29 21:34:22

#include<bits/stdc++.h>
using namespace std;
int main()
{
	priority_queue<int>q;
	int n,m,k,x,y;
	cin>>n>>m>>k;
	while(n--)
	cin>>x,q.push(x);
	while(m--)
	{
        while(q.size()>k)
		q.pop();
		cin>>x;
		if(x&1)
		cin>>y,q.push(y);
		else
		{
			if(q.size()<k)
			cout<<"-1\n";
			else cout<<q.top()<<'\n';
		}
		
	}
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 234ms, 内存消耗: 5128K, 提交时间: 2023-01-12 23:27:47

#include<bits/stdc++.h>
std::priority_queue<int>q;
int n, m, k,x,y,i;
int main(){
	for(std::cin >> n >> m >> k,i=0;i<n;++i)std::cin >> x, q.push(x);
	while (m--){
        while (q.size() > k)q.pop();
		std::cin >> x;
		if (x==1)std::cin >> y, q.push(y);
		else q.size() < k?std::cout << "-1\n":std::cout << q.top() << '\n';
	}
}

上一题