考虑一个20分的\(O(n^2)\)做法:枚举答案区间\([l,r]\),那么显然要把尽可能多的1填入\([l,r]\)。使用前缀和计算\([l,r]\)中\(0\)的个数,那么填入后的价值可以\(O(1)\)计算。

然后区间内非\(0\)的数的和也可以\(O(1)\)计算

考虑优化这个做法:设\(g_i\)表示以\(i\)为右端点时,最大的\(l\)使得区间\([l,r]\)中的\(0\)的个数\(\leq k\)。

随着\(i\)的增大,\(g_i\)显然递增,所以可以在均摊\(O(n)\)的时间内计算\(g\)

如果\(l\geq g_i\),则区间内的所有\(0\)填\(1\)最划算,设\(s1\)为把数组内所有\(0\)视为\(1\)后的前缀和数组,则区间\([l,r]\)的价值为\(s1_r-s1_{l-1}\)。

枚举\(r\),我们需要求出\([g_r-1,r-1]\)中的\(s1\)的最小值。由于\(g_i\)随着\(i\)的递增而递增,所以可以用单调队列维护最小值。

如果\(l \le g_i\),则区间的价值为先把区间的所有\(0\)视为\(-1\),然后把\(k\)个\(-1\)反转为\(1\)后的区间和。(反转后区间和加上\(k*2\))

设\(s2\)为把数组内所有\(0\)视为\(-1\)后的前缀和数组,则区间\([l,r]\)的价值为\(s2_r-s2_{l-1}+k*2\)。

枚举\(r\),我们需要求出\([0,g_r-2]\)中的\(s2\)的最小值。可以用前缀最小值维护。

总时间复杂度\(O(n)\)

最新文章

  1. 又发现个.net framework的坑
  2. js-BOM之offset家族、移动函数的封装升级(轮播图)
  3. 【python游戏编程之旅】第二篇--pygame中的IO、数据
  4. Git操作指南(2) —— Git Gui for Windows的建库、克隆、上传
  5. Windows Server 2003服务器.net4.0+IIS6.0的服务器,IE11浏览器访问的不兼容性
  6. windwos iis 7.5 使用html 报405错误
  7. python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客
  8. Android开发:最详细的 NavigationDrawer 开发实践总结
  9. [转] gdb的基本工作原理
  10. restful_api
  11. C/C++用strncpy()与strstr()分割与匹配查找字符串
  12. MySQL导出csv乱码问题的解决
  13. sql decimal & float & celling 介绍
  14. activiti 5.15.1 动态手动通过java编码方式,实现创建用户任务,动态指定个人,用户组,角色,指定监听的实现
  15. 小Writeup
  16. 201521123101 《Java程序设计》第10周学习总结
  17. maven项目添加db2的jar包
  18. 《An Introduction to Signal Smoothing》译文
  19. VirtualBox: Resize a Fedora, CentOS, or Windows Dynamic Guest Virtual Disk (VDI) in VirtualBox
  20. Plugin Kotlin was not installed: Cannot download

热门文章

  1. 51nod 1594 Gcd and Phi
  2. python获取当前季度或上一季度的起止日期
  3. tool/js - ChineseToPinyin 汉语转拼音
  4. 1. mongodb基础:cursor.forEach使用
  5. android audiorecord初始化失败相关资料收集
  6. springboot+mybatis实现增删改查
  7. 微信小程序图片和签名
  8. 【转载】rename。给文件批量改名的python脚本
  9. seata数据源代理
  10. python 删除大于超过一定时间文件