NC214362 第k小

 刚开始学,做个笔记记录一下。用c++

题目描述

有一个长度为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

思路:

开始先声明一个priority_queue<int> q; 注意这个优先队列默认排序是less,也就是队列里的元素从大到小排序

然后输入n,m,k和队列元素,之后就要判断第k小的元素,因为队列自动帮我们排好序了,所以第k小的元素位置就是队列里的倒数第k位,我们只要把前面的元素都pop()出来,pop()的前提是k不能大于q.size(),否则就输出-1,pop()完后队列里的第一个元素就是第k小的元素了,然后我们用q.top()输出元素就可以

代码如下

#include <bits/stdc++.h>
using namespace std;

priority_queue<int> q;

int main()
{
    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 << q.top() << '\n';
            else
                cout << '-1\n';
        }
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值