codeforces 727F. Polycarp's problems DP or 二分预处理答案

本篇博客介绍了一道来自Codeforces的727F问题,涉及动态规划(DP)和二分查找的预处理策略。题目要求在读取n个问题时,保持心情值(由问题价值累加得到)始终大于等于0,同时处理m个询问,询问特定心情值下最少删除多少问题。博主提供了两种解决方案:1) 使用二分搜索配合贪心策略,2) 应用动态规划方法。每种方法的时间复杂度分别为O(n^2*logn*log10^15+m*logn)和O(n^2+m*logn)。
摘要由CSDN通过智能技术生成


题目链接http://codeforces.com/contest/727/problem/F 
题目大意:有n个问题,每个问题有一个价值ai,一开始的心情值为q,每当读到一个问题时,心情值将会加上该问题的价值。问题只能按顺序读。有m个询问,求当q=bi时,至少要删去多少个问题才能使得在任何时候心情值都>=0。 
数据范围:1 ≤ n ≤ 750, 1 ≤ m ≤ 200 000, - 10^9 ≤ ai ≤ 10^9, 0 ≤ bi ≤ 10^15

题解:显然我们不能等到询问的时候再处理,这样时间复杂度太大承受不下。所以我们可以先预处理出ans[i]表示如果要留下 i 个问题那么一开始的心情值至少要为多少,显然ans是非递减的序列,我们可以在询问的时候二分即可找出答案。处理出ans有两种方法:

1.二分+贪心 
虽然复杂度有点危险但是因为本蒟蒻的贪心太差于是还是写了下来(反正cf评测机快hhhh)。 
首先我们可以知道,如果ans[i]=x时满足条件,那么ans[i]=x+1时也是满足条件的(废话),于是我们还是可以二分。对于 i ,我们二分出mid,判断当q=mid时,能否留下 i 个问题。这里的判定我们可以用贪心。一开始心情值为mid,每当遇到一个新的问题 j 时,把心情值加上a[ j ],然后把a[j]存进一个小根堆里,如果当前的心情值小于0,就把心情值减去堆里最小的数(这必然是个负数且小于等于a[ j ]),然后把这个数移出堆。如果最后被移出堆的数<=n-i 就说明这个mid符合条件。询问的时候在ans上查找就可以了。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值