题意

有 \(n\) 个不降的非负整数数组,每个数组可以不取或取一个前缀,总共要取 \(k\) 个元素,问取到的和最大多少。

题解

结论题,但是想到结论还不会。

首先,我们只会有一个数组没选完,其它要么全选要么不选。证明考虑假设两个数组都没选完,基于数组单调不降进行一些分类讨论会发现存在一些严格不劣的调整方法。

接下来,我们相当于指定一个数组不要选,然后对剩下做 01-背包,接下来只要枚举指定的数组选几个即可。然后这个是 \(\Theta(n^2k)\) 的,于是你寄了。

01 背包是经典 max-plus 卷积,合并两个背包需要 \(\Theta(k^2)\) 的时间,而加入一个物品需要 \(\Theta(k)\) 的时间,\(n, k\) 同阶,所以别去想依赖于合并背包的做法。首先你有一个想法,当你先后枚举某两个数组不选的时候,左边的数组左边的那些物品和右边的数组右边的那些物品被重复计算了,这是浪费时间的地方。于是考虑分个块,对于一个块,预处理加入从左端点一直到块左端点的所有物品,这部分总共加入了 \(\Theta(n\cdot\frac n B)\) 次,以及从右端点一直到块右端点的所有物品,这样你枚举块内的物品,每次只需要在预处理出的背包中加入 \(\Theta(B)\) 个物品。于是你得到了一个 \(\Theta(nk\sqrt n)\) 的做法。

考虑把上面的分块换成分治,变成每次加入右边所有物品,递归到左边;加入左边所有物品,递归到右边。这样时间 \(\Theta(nk\log n)\),空间 \(\Theta(k\log n)\)。

CF1442D Sum的更多相关文章

  1. CF1442D Sum (动态规划,线段树分治)

    ( 宋 体 字 看 起 来 真 舒 服 ) _{_{(宋体字看起来真舒服)}} (宋体字看起来真舒服)​​ 题 面 ( 洛 谷 翻 译 ) 题面_{_{(洛谷翻译)}} 题面(洛谷翻译)​​ 给定 n ...

  2. LeetCode - Two Sum

    Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...

  3. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  4. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  5. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  6. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  7. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  8. [LeetCode] Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  9. [LeetCode] Split Array Largest Sum 分割数组的最大值

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  10. [LeetCode] Sum of Left Leaves 左子叶之和

    Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...

随机推荐

  1. ​k8s 1.24 1.25 集群使用docker作为容器

    Kubernetes 1.24 1.25 集群使用docker作为容器 背景 在新版本Kubernetes环境(1.24以及以上版本)下官方不在支持docker作为容器运行时了,若要继续使用docke ...

  2. win32print常用函数

    这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html OpenPrinter 打开指定的打印机,并 ...

  3. window远程桌面之通过修改端口链接

      windows开启及连接远程桌面 技术标签: 后端开发  windows         桌面 -> 此电脑 图标右键 -> 属性 远程设置 远程桌面 -> 修改为允许远程连接到 ...

  4. [JavaScript]Promise:异步编程

    1 文由 某项目的需求:先要请求API1,再以API1的结果请求API2. var n, a; //var r = window.md5; var r = function (password, us ...

  5. [Java]排序算法>选择排序>【简单选择排序】(O(n*n)/不稳定/)

    1 选择排序 1.1 算法思想 每一趟从待排序的记录中选出关键字最小的记录,按顺序放在已排序的记录序列的最后(or最前面),直到全部排完位置. 1.2 算法特征 属于[选择排序] 简单选择排序 堆排序 ...

  6. Appuploader证书申请教程

    转载:http://kxdang.com/topic/appuploader/certification.html IOS证书制作教程 点击苹果证书 按钮 点击新增 输入证书密码,名称 这个密码不是账 ...

  7. 第7章. 部署到GiteePages

    Gitee Pages 是一个免费的静态网页托管服务,您可以使用 Gitee Pages 托管博客.项目官网等静态网页.如果您使用过 Github Pages 那么您会很快上手使用 Gitee 的 P ...

  8. asyncio的基本使用框架,python高效处理数据,asyncio.gather(),asyncio. create_task(),asyncio.run(main())

    asyncio 是 Python 3.4 引入的标准库,是一个基于事件循环的异步 I/O 并发库.它提供了一种协作式的多任务处理方式,使得我们能够在一个线程中并发处理多个 I/O 操作.它通过将 I/ ...

  9. vue中获取所有路由

    在router实例上有options属性:

  10. Selenium 高亮显示操作元素

    一.代码 使用 https://www.cnblogs.com/TSmagic/p/16595168.html 此篇代码即可 二.编辑 test_ys_case.py 文件 # coding=utf- ...