题目传送门:https://codeforces.com/problemset/problem/913/D
题目大意:
给定\(n\)个题和总时限\(T\),每道题有两个参数\(a_i,t_i\),\(t_i\)表示所需时间,\(a_i\)表示总做题数不超过\(a_i\)才能拿到第\(i\)题的分数(每道题分数都为1)。即,若你能解决第\(p_1,p_2,...,p_k\)个问题,则所获得分数为\(\sum\limits_{j=1}^k[k\leqslant a_j]\)
问所能获得的最大分数?
先介绍一下简单的做法(
贪心地去选\(t_i\)最小的,即按\(t_i\)排序
记当前选中的题数目为\(k\),如果存在最小的\(a_j\)使得\(a_j,则剔除\(a_j中\(t_j\)最大的,直到所有\(a_i\leqslant k\)为止
……
然后介绍一下我自己想的做法
假定我们做了\(p\)题拿了\(q\)分\((p>q)\),那我们必然可以剔除所做的题目中\(a_i\)最小的\(p-q\)个题目,这样我们的最终分数至少是\(q\)分
故令 \(p=q\) 一定不会使答案更劣,那么我们可以二分做题数\(k\),则我们可以从所有 \(a_i\geqslant k\) 的题目中,选出 \(t_i\) 最小的\(k\)个题出来,将其\(t_i\)累加与\(T\)进行判断
用主席树维护即可
/*program from Wolfycz*/
#include