那些算法的空间优化

那些算法的空间优化

猫树分治

例题:[ABC426G] Range Knapsack Query

朴素实现:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;using ll = long long;constexpr int N = 20000 + 1, K = 500 + 1, Q = 200000 + 1;int w[N], v[N];
struct {int l, r, c;
} que[Q];
ll f[N][K], ans[Q];int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;for (int i = 1; i <= n; ++i) {cin >> w[i] >> v[i];}int q;cin >> q;for (int i = 1; i <= q; ++i) {auto &[l, r, c] = que[i];cin >> l >> r >> c;}auto dfs = [&](auto &&self, int l, int r, const vector<int> &qid) {if (l == r) {for (int i : qid) {ans[i] = que[i].c >= w[r] ? v[r] : 0;}return ;}int mid = (l + r) >> 1;memset(f[mid], 0, sizeof(f[mid]));for (int i = w[mid]; i < K; ++i) {f[mid][i] = v[mid];}for (int i = mid - 1; i >= l; --i) {memcpy(f[i], f[i + 1], sizeof(f[i]));for (int j = K - 1; j >= w[i]; --j) {f[i][j] = max(f[i][j], f[i][j - w[i]] + v[i]);}}memset(f[mid + 1], 0, sizeof(f[mid + 1]));for (int i = w[mid + 1]; i < K; ++i) {f[mid + 1][i] = v[mid + 1];}for (int i = mid + 2; i <= r; ++i) {memcpy(f[i], f[i - 1], sizeof(f[i]));for (int j = K - 1; j >= w[i]; --j) {f[i][j] = max(f[i][j], f[i][j - w[i]] + v[i]);}}vector<int> lq, rq;for (int i : qid) {auto [ql, qr, qc] = que[i];if (qr <= mid) {lq.push_back(i);} else if (mid < ql) {rq.push_back(i);} else {for (int j = 0; j <= qc; ++j) {ans[i] = max(ans[i], f[ql][j] + f[qr][qc - j]);}}}if (!lq.empty()) {self(self, l, mid, lq);}if (!rq.empty()) {self(self, mid + 1, r, rq);}};vector<int> qid(q);for (int i = 0; i < q; ++i) {qid[i] = i + 1;}dfs(dfs, 1, n, qid);for (int i = 1; i <= q; ++i) {cout << ans[i] << '\n';}return 0;
}

在最坏构造下,如所有询问的 \(l_i = r_i\),则每个询问都会在分治树的每一层的其中一个 vector 出现恰好一次,所以这部分的空间复杂度是 \(O(q \log n)\),有时会成为瓶颈。

优化成 \(\Theta(q)\) 的方法比较自然,使每个分治结点共用同一个询问编号序列即可。具体的,每个分治结点记录的额外信息从 \((\text{le}, \text{ri})\),表示该子树需要处理的询问在编号序列中的下标区间为 \([\text{le}, \text{ri}]\)。递归下去前将左子树的询问在询问序列上从 \(\text{le}\) 向右重写,将左子树的询问在询问序列上从 \(\text{ri}\) 向左重写即可。

猫树分治部分实现:

auto dfs = [&](auto &&self, int l, int r, int le, int ri) {if (l == r) {for (int i = le; i <= ri; ++i) {ans[qid[i]] = que[qid[i]].c >= w[r] ? v[r] : 0;}return ;}int mid = (l + r) >> 1;memset(f[mid], 0, sizeof(f[mid]));for (int i = w[mid]; i < K; ++i) {f[mid][i] = v[mid];}for (int i = mid - 1; i >= l; --i) {memcpy(f[i], f[i + 1], sizeof(f[i]));for (int j = K - 1; j >= w[i]; --j) {f[i][j] = max(f[i][j], f[i][j - w[i]] + v[i]);}}memset(f[mid + 1], 0, sizeof(f[mid + 1]));for (int i = w[mid + 1]; i < K; ++i) {f[mid + 1][i] = v[mid + 1];}for (int i = mid + 2; i <= r; ++i) {memcpy(f[i], f[i - 1], sizeof(f[i]));for (int j = K - 1; j >= w[i]; --j) {f[i][j] = max(f[i][j], f[i][j - w[i]] + v[i]);}}int lp = le - 1, rp = ri + 1;for (int i = le; i <= ri; ++i) {auto [ql, qr, qc] = que[qid[i]];if (qr <= mid) {buf[++lp] = qid[i];} else if (mid < ql) {buf[--rp] = qid[i];} else {for (int j = 0; j <= qc; ++j) {ans[qid[i]] = max(ans[qid[i]], f[ql][j] + f[qr][qc - j]);}}}if (le <= lp) {memcpy(qid + le, buf + le, sizeof(int) * (lp - le + 1));self(self, l, mid, le, lp);}if (rp <= ri) {memcpy(qid + rp, buf + rp, sizeof(int) * (ri - rp + 1));self(self, mid + 1, r, rp, ri);}
};
iota(qid + 1, qid + q + 1, 1);
dfs(dfs, 1, n, 1, q);

优化前:https://atcoder.jp/contests/abc426/submissions/71565759

优化后:https://atcoder.jp/contests/abc426/submissions/71565702

时空的区别不明显,猜测是因为:

  1. \(q\) 比较小,所以本题的瓶颈不在这一部分
  2. 没认真卡,递归层数较浅(存疑)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/992664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找2025台阶仪厂家?锁定高精度,这份选型指南直接抄

找2025台阶仪厂家?锁定高精度,这份选型指南直接抄!台阶仪作为微电子、精密加工、材料研究等领域的核心测量设备,其选型质量直接影响检测数据的可靠性。2025 年选型需围绕实际应用场景,重点关注以下关键维度,确保设…

2025年毛巾专业工厂五大推荐,新测评精选毛巾制造厂

为帮企业高效锁定适配自身需求的毛巾生产合作伙伴,避免选型走弯路,我们从技术落地能力(如材料研发、工艺革新)、产品性能(含清洁效能、耐用性)、全周期服务质量(覆盖定制研发到售后保障)及真实客户口碑(侧重同…

人大金仓kingbase8常用配置和命令

一、配置集群更新授权 1.将授权文件放入数据库目录中替换原有授权问题 2.进入kingbase/bin目录下,执行./sys_ctl reload -D <数据目录> 二、配置集群数据源主节点 192.168.0.111 备节点 192.168.0.112 端口 543…

STM32F030开发环境搭建

STM32F030开发环境搭建$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");纪念文章,当时啥也不会,现在建议直接STM32CubeIDE 长话短说,由于突然要调试别人画…

2025年中国生物标本五大品牌推荐:河南大科实力凸显

TOP1 推荐:河南大科教学仪器有限公司 推荐指数:★★★★★ 口碑评分:河南地区标杆级生物标本企业 专业能力:河南大科教学仪器有限公司是集科研、开发、生产、销售、服务为一体的高新技术企业,核心产品覆盖教学/科…

2025优质阻燃泡棉厂家排行

2025优质阻燃泡棉厂家排行。阻燃泡棉是一种具备防火阻燃性能的泡棉材料,能在接触火焰时抑制燃烧或减缓燃烧速度,减少烟雾和有毒气体产生。它在建筑、汽车、电子、家具、医疗器械等多个行业应用广泛,比如建筑装修中的…

2025年长春五大专业的理想汽车改装公司排行榜,口碑不错的理

为帮理想车主高效锁定适配需求的改装合作伙伴,避免踩坑走弯路,我们从施工技术实力(如技师资质、硬件设备)、服务透明程度(含过程监管、验收标准)、售后保障体系及真实客户口碑四大维度,对多家服务商展开深度评估…

2025国内十大优质输送机厂家实力盘点

在工业生产的物料搬运环节,输送机是串联产线、提升效率的核心设备。当下自动化需求持续增长,输送机市场规模稳步扩大,但也存在设备适配难、售后响应慢等问题,选对厂家成为企业降本增效的关键。本文聚焦 2025 年国内…

冲压机械手生产商哪家好?2025口碑冲床机械手厂家排名

在冲压加工行业里,人工上下料不仅效率低,还容易出现安全事故。如今,冲压机械手成了替代人工的关键设备,能大幅提升生产效率、保障作业安全。但市面上冲压机械手生产商数量多,实力参差不齐,企业想选到靠谱厂家并不…

2025专业化学镍生产线公司TOP5权威推荐:甄选设备供货商

表面处理行业中,企业对高精度、高稳定性的化学镍生产线需求日益迫切。2024年数据显示,国内化学镍设备市场规模突破120亿元,年增速达32%,但31%的投诉集中在成本控制难、工艺稳定性差、废水处理复杂三大痛点——某汽…

2025模切厂家哪家好?精选可靠产品

2025模切厂家哪家好?精选可靠产品。模切是一种常见的材料加工工艺,简单说就是通过模具对纸张、薄膜、金属箔、泡棉等材料进行裁切,做出特定形状的产品或零部件。它在电子、包装、汽车、医疗器械等多个行业都有广泛应…

【学习笔记】Linux 小记

开了一个新坑,正在慢慢填坑中。未完待续。泛滥河水将我冲向你的心头,不停流 ......

丝扣管件厂家有哪些?2025工业管件厂家实力榜单

工业管件是石油化工、电力、储能等多个工业领域的关键配套部件,就像工业系统中的 “连接枢纽”,保障流体传输的稳定与安全。如今,随着工业 4.0 的推进,工业管件行业正朝着自动化、数字化方向发展,精密铸造、智能加…

攻防世界Robots

1根据题目提示与网站协议有关 Robots 协议的配置文件robots.txt通常存放在网站根目录下,因此在题目提供的网址后添加/robots.txt 2找到协议配置文件 3提取Disallow后的路径 4即找到flag flag cyberpeace 总结 1.访…

2025刀闸门厂家推荐综合榜单

2025刀闸门厂家推荐综合榜单。刀闸门是一种通过刀片式闸板切断介质的阀门设备,广泛应用于污水处理、水利工程、矿山冶金、造纸印染等领域,主要用于控制污水、泥浆、矿浆、纸浆等含杂质介质的流通。从行业现状来看,随…

vue 常用的 gantt 甘特图组件推荐

vue 常用的 gantt 甘特图组件推荐,项目中使用过的甘特图组件,各有优缺点。 dhtmlx-gantt 甘特图 https://dhtmlx.com/docs/products/demoApps/ 老牌的甘特图组件,给你非常全面,使用难度高,可定制化功能比较一般,…

2025年实力强的园艺火花塞生产厂家推荐、园艺火花塞生产厂家

在精细化农业与园艺产业升级的浪潮中,园艺火花塞作为园林机械(如割草机、绿篱机、油锯)的点火核心,直接影响设备动力输出与燃油效率。面对市场上品类繁杂的园艺火花塞产品,如何选择技术可靠、适配性强的生产厂家?…

2025年中国中药植物标本五大供应商推荐:河南大科蝴蝶标本优

TOP1 推荐:河南大科教学仪器有限公司 推荐指数:★★★★★ 口碑评分:国内中药植物标本领域标杆企业 专业能力:河南大科教学仪器有限公司是集科研、开发、生产、销售、服务为一体的高新技术企业,专注生物标本细分领…

2025年五大不锈钢网供应商推荐,专业不锈钢网厂家哪家好全解

在工业制造、环保水处理、建筑防护等领域,不锈钢网作为关键基础材料,其品质直接关系到生产安全与效率。面对市场上良莠不齐的不锈钢网供应商,如何找到靠谱的厂家?以下依据综合实力、产品品质、服务能力等维度,为你…