传送门
官方题解是这么说的:
对于第i个位置,怎样选择数字才会使满足条件情况下选择数字数目最少呢?很容易想到,需要选择前i1个数中较大的数字,使其变为0。
基于这个思想,如果我们对于每个位置i都暴力去找最大的前几个数,显然会TLE!
可以注意到,题目可以转化为前i-1个数中最多选出多少个数字和W[i]相加使得其和小于等于m(很容易想到,选择较小的数才会使选的数最多)。转化之后就很容易想到用线段树来维护了。
我们对给定数组进行离散化,对于离散化之后的数组建立一颗线段树,线段树上的每个节点记录区间之和以及区间内数字个数。 时间复杂度:N*log(N)。
TQL TQL,OTZ OTZ。。。
转化思想真的好厉害啊,和6608其实有点点像呢。。
用线段树的话,用每个节点维护1~节点下标的前缀和,初始的时候,是一棵空树。然后不断添加,把数字插入自己正确的大小的地方(有一点像权值线段树诶)。
但是看到大佬用树状数组就可以了,也是,维护两个前缀和(一个用来算“加起来不能超过m”,一个用来算“这个前缀和由多少个数组成”),也不是很需要线段树呐~
自己还是需要努力鸭~