题目翻译

$n$ 次操作,每次两个数 $a_i,b_i$,在一个初始为空的序列里插入 $b_i$ 个 $a_i$,操作结束后问第 $k$ 小是什么。

题目思路

类似于 ABC247D 的写法,还是个弱化版。

我们不用真的插入 $b_i$ 个 $a_i$,只需记录 $b_i$ 有多少即可,因为很多的数都用不到。

这是很多个一添,同理,我们可以很多个一删。

所以我们用一个 pair 记录两个量,数字次数

然后按数字的大小排序,最后遍历数组,每次用 $k$ 减掉出现次数,如果此时 $k\leqslant0$,那么就输出当前数字。

注意,$k$ 最大可以为 $100000^2$,那么开好 long long

我因为这个错了一次……

AC 代码

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
vector<pair<ll,ll>>v;
int main()
{
    ll n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        int a,b;
        cin>>a>>b;
        v.push_back(make_pair(a,b));//插入数字和次数
    }
    sort(v.begin(),v.end());//pair的排序默认先看first,也就是此题中的数字的大小
    for(int i=0;i<(int)v.size();i++)
    {
        k-=v[i].second;//减掉出现次数
        if(k<=0){cout<<v[i].first<<endl;return 0;}//<=0时,输出当前数字。
    }
    return 0;
}
最后修改:2023 年 04 月 20 日
v我50吃疯狂星期四