【HDU6609 Find the answer】线段树||树状数组维护前缀和

传送门


官方题解是这么说的:


  对于第i个位置,怎样选择数字才会使满足条件情况下选择数字数目最少呢?很容易想到,需要选择前i1个数中较大的数字,使其变为0。

  基于这个思想,如果我们对于每个位置i都暴力去找最大的前几个数,显然会TLE!

  可以注意到,题目可以转化为前i-1个数中最多选出多少个数字和W[i]相加使得其和小于等于m(很容易想到,选择较小的数才会使选的数最多)。转化之后就很容易想到用线段树来维护了。

  我们对给定数组进行离散化,对于离散化之后的数组建立一颗线段树,线段树上的每个节点记录区间之和以及区间内数字个数。 时间复杂度:N*log(N)。



  TQL TQL,OTZ OTZ。。。

  转化思想真的好厉害啊,和6608其实有点点像呢。。

  用线段树的话,用每个节点维护1~节点下标的前缀和,初始的时候,是一棵空树。然后不断添加,把数字插入自己正确的大小的地方(有一点像权值线段树诶)。

  但是看到大佬用树状数组就可以了,也是,维护两个前缀和(一个用来算“加起来不能超过m”,一个用来算“这个前缀和由多少个数组成”),也不是很需要线段树呐~

  自己还是需要努力鸭~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值