题目翻译
$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;
}