CodeChef COVERING - Covering Sets 题解
蒟蒻 CC 首 A 祭!写篇题解纪念一下。
虽然并没有那么难,但是我想了整整一周,今天不知道怎的英语课看电影的时候就想出来了(
先考虑只有两个数组 的情况,是要求 的值。
如果 的定义是 能覆盖 的话,那就非常简单了,就直接枚举 然后高维前缀和相乘就可以了(这个后面说)。但实际上是 覆盖 ,这两者本质是不同的。我们考虑先换个贡献体,用 来贡献,那么答案就是 。
然后这个你要是直接枚举 的话,那么最好也只能做到子集枚举的复杂度(以我当前水平)。我们考虑枚举 的值,本质上也是一次换贡献体,那么答案是 。
那么我们只需要求出 。这个可以很自然的想到这样一个思路:先看 ,这个可以把 往前移一格,然后就变成了 两个数组的高维前缀和相乘(就是前面说要后面说的那个东西)。这个式子中的 可以保证 ,但是不一定 。不难想到把 的那些 的贡献给删掉,不难想到这样一个 DP:。
求这个 DP 数组的话,最直观的想法是动态维护高维前缀和,但这真的可做吗……(upd. 2020.12.25:好像真的可做,真香/cy(那这个高维差分不就可以用动态高维前缀和随便做了吗))其实这个 这个形式是一个很经典的东西,它是高维差分的一个经典模型。高维差分这个东西本身不是很好理解,但可以用它的逆运算——高维前缀和来理解它,不难发现由 有 ,由后面是高维前缀和可以得到前面就是高维差分。那么就 算一下就可以了。
然后扩展到 个数组的话基本没有变化,就高维前缀和相乘的时候多出来一个乘数。
吹个牛逼,之前我学高维前缀和的时候自己 yy 出了这个高维差分,感觉啥用没有,但现在看来是个挺常用的东西(
code(三分钟代码)
珍爱生命,远离抄袭!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话