比赛开始直接优先队列乱搞,TLE。。
题意
问你最小需要删多少个数字才能使得从第一个数到第i个数字的和<= m,第i个数字不能删。
思路
我们自然想到删除尽量大的数字,但是如果我们当前访问到第i个数字时,总是对前i - 1个数字进行排序肯定会超时。我们可以建立一棵从第一个数字到当前数字的权值线段树,每个节点记录当前区间内数字和以及个数。这样我们就可以根据权值线段树进行查找,利用权值线段树的原因是权值线段树本身也是一棵有序的树,查找是可以二分的。这样就达到了查询O(logn)复杂度。本身权值线段树我是一直用主席树写的,但是这个题目会MLE,再者,这个题目每次都是查询前i个数,因此建一颗线段树即可,查询完毕再更新下一个数字。
1 |
|