11.20 C 盲盒流水线

news/2025/11/21 7:45:16/文章来源:https://www.cnblogs.com/Nainong2257/p/19250212

题解 : 盲盒流水线

link

给定 \(n\) 个物品,每个物品有价值和质量,\(q\) 次询问,在 \([l , r]\) 中选质量不超过 \(m\) 的物品,每个物品至多选一次,并且要让价值最大

$ 1 \leq n \leq 20000$
$ 1 \leq m_i \leq 500$
$ 1 \leq q \leq 100000$

第一眼,这不是背包吗?

暴力:\(O(nmq)\) \(49pts\)

const int N = 2e4 + 20, mod = 998244353;
int n, v[N], w[N], q, g[N], f[N], p[N];
signed main(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; ++i)cin >> v[i] >> w[i];cin >> q;for(int qwq = 1, l, r, m, cnt = 0; qwq <= q; ++qwq, cnt = 0){cin >> l >> r >> m;g[0] = 1;for(int i = l; i <= r; ++i){for(int j = m; j >= w[i]; --j){if(f[j] < f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], g[j] = g[j - w[i]] % mod ;else if(f[j] == f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], (g[j] += g[j - w[i]]) %= mod;   }}for(int i = 1; i <= m; ++i)(cnt += (f[i] == f[m]) * g[i] % mod) %= mod;cout << f[m] << ' ' << cnt << '\n';for(int i = 0; i <= m; ++i)f[i] = g[i] = 0;} return 0;
}

然后可以上一些数据结构? 本机房大蛇bjt赛时似乎用一些数据结构优化到了 \(66pts\), 但是我没看懂

我们发现,这个区间会被反复查询导致有重复,由于背包只能加不能删,所以赛时我用回滚莫队优化 \(dp\),单次移动指针是 \(O(m)\) 的,最终复杂度 \(O(n m \sqrt q)\), 可以获得 \(83pts\)

机房大佬 洛阳民宿的 tj

赛时代码:

const int M = 510, Q = 1e5 + 20, N = 2e4 + 20, mod = 998244353;
int n, qwq, v[N], w[N], B, cnt, L[N], R[N], bel[N], z, g[M], f[M], f_[M], g_[M], Mx[Q];
struct Que{int l, r, m, id;
}q[Q];
pair<int,int> ans[Q];
vector<Que>G[Q];
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; ++i)cin >> v[i] >> w[i];cin >> qwq;B = n / (sqrt(qwq) + 1) + 1, cnt = n / B;for(int i = 1; i <= cnt; ++i)L[i] = (i - 1) * B + 1, R[i] = B * i;if(R[cnt] < n)++cnt, L[cnt] = R[cnt - 1] + 1, R[cnt] = n;for(int i = 1; i <= cnt; ++i)for(int j = L[i]; j <= R[i]; ++j)bel[j] = i;for(int i = 1, l_, r_, m_; i <= qwq; ++i){cin >> l_ >> r_ >> m_;if(bel[l_] == bel[r_]){g[0] = 1;int as = 0, zz = 0;for(int i = l_; i <= r_; ++i){for(int j = m_; j >= w[i]; --j){if(f[j] < f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], g[j] = g[j - w[i]] % mod ;else if(f[j] == f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], (g[j] += g[j - w[i]]) %= mod;   zz = f[zz] < f[j] ? j : zz;}}for(int i = 1; i <= m_; ++i)(as += (f[i] == f[zz]) * g[i] % mod) %= mod;ans[i] = {f[zz], as}; for(int i = 0; i <= m_; ++i)f[i] = g[i] = 0;}   else G[bel[l_]].push_back({l_, r_, m_, i}), Mx[bel[l_]] = max(m_, Mx[bel[l_]]);}for(int i = 1; i <= cnt; ++i)if(G[i].size())sort(G[i].begin(), G[i].end(), [](Que a, Que b){return a.r < b.r;});for(int b = 1; b <= cnt; ++b){if(!G[b].size())continue;memset(g, 0, sizeof(g));memset(f, 0, sizeof(f));g[0] = 1;int l_ = R[b], r_ = R[b] + 1, zz = 0;int mm = Mx[b];for(auto [l, r, m, id] : G[b]){int as = 0;for(int i = r_; i <= r; i++){for(int j = mm; j >= w[i]; --j){if(f[j] < f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], g[j] = g[j - w[i]] % mod ;else if(f[j] == f[j - w[i]] + v[i])f[j] = f[j - w[i]] + v[i], (g[j] += g[j - w[i]]) %= mod;   }}r_ = r + 1;for(int i = 0; i <= mm; ++i)f_[i] = f[i], g_[i] = g[i]; for(int i = l_; i >= l; --i){for(int j = mm; j >= w[i]; --j){if(f_[j] < f_[j - w[i]] + v[i])f_[j] = f_[j - w[i]] + v[i], g_[j] = g_[j - w[i]] % mod ;else if(f_[j] == f_[j - w[i]] + v[i])f_[j] = f_[j - w[i]] + v[i], (g_[j] += g_[j - w[i]]) %= mod;   }}for(int i = 1; i <= m; ++i)(as += (f_[i] == f_[m]) * g_[i] % mod) %= mod;ans[id] = {f_[m] , as};for(int i = 0; i <= mm; ++i)f_[i] = g_[i] = 0;}}for(int i = 1; i <= qwq; ++i)cout << ans[i].first << ' ' << ans[i].second << '\n';   return 0;
}

由于没有修改操作,我们考虑猫树分治

其实在很早之前一场abc,我了解过猫树分治的说,但是我把他放到任务清单里后就没有再理他。。。

ABC426G,P6240 都是原题

算法大概是这样的:

我们选定当前区间 \([l, r]\)\(mid\) ,从 \(mid\) 向前向后预处理处理到边界,将左右边界在这个区间内的询问进行处理答案

合并两个背包是 \(O(n^2)\) 的,但是我们单纯统计答案,只需要 res = max(res, L[b[i].l][j] + R[b[i].r][b[i].m - j]) 就可以 \(O(m)\) 的时间内统计答案

时间复杂度应该是 \(T(n) = 2T(n / 2) + O(n) = O(n \log n)\)

总时间复杂度是 \(O(nm \log n + qm)\)

关于初始化,我一开始发现将 只将 GL[mid + 1][0]GR[mid][0] 设成\(1\),发现答案会小,把 GL[mid + 1] GR[mid] 都设成 \(1\), 发现答案会变大

然后,我将 GL[mid + 1][0]GR[mid] 设成 \(1\) 就过了,我自己的解释就是说,我们对于左边的只取恰好的,右边的取小于等于的,这样每一种方案只会被统计一次

const int mod = 998244353, N = 2e4 + 20, Q = 1e5 + 20, M = 502;
int n, v[N], w[N], qwq, L[N][M + 20], R[N][M + 20], GL[N][M + 20], GR[N][M + 20];
pair<int, int>ans[Q];
struct Que{int l, r, m, id;
}q[Q], b[Q]; 
void solve(int l, int r, int ql, int qr){int mid = (l + r) >> 1;if(ql > qr)return;for(int i = 0; i <= M + 5; ++i)L[mid + 1][i] = 0, GL[mid + 1][i] = !i; for(int i = mid; i >= l; --i){for(int j = 0; j <= M; j++){GL[i][j] = GL[i + 1][j], L[i][j] = L[i + 1][j];if(j >= w[i]){if(L[i + 1][j - w[i]] + v[i] > L[i][j])L[i][j] = L[i + 1][j - w[i]] + v[i], GL[i][j] = GL[i + 1][j - w[i]];else if(L[i + 1][j - w[i]] + v[i] == L[i][j])(GL[i][j] += GL[i + 1][j - w[i]]) %= mod;}}}for(int i = 0; i <= M + 5; ++i)R[mid][i] = 0, GR[mid][i] = 1;for(int i = mid + 1; i <= r; ++i){for(int j = 0; j <= M; ++j){GR[i][j] = GR[i - 1][j], R[i][j] = R[i - 1][j];if(j >= w[i]){if(R[i - 1][j - w[i]] + v[i] > R[i][j])R[i][j] = R[i - 1][j - w[i]] + v[i], GR[i][j] = GR[i - 1][j - w[i]];else if(R[i - 1][j - w[i]] + v[i] == R[i][j])(GR[i][j] += GR[i - 1][j - w[i]]) %= mod;}}}int nql = ql, nqr = qr;for(int i = ql; i <= qr; ++i)b[i] = q[i];for(int i = ql; i <= qr; ++i){if(b[i].r < mid)q[nql++] = b[i]; else if(b[i].l > mid)q[nqr--] = b[i];else{int res = 0, as = 0; for(int j = 0; j <= b[i].m; ++j)res = max(res, L[b[i].l][j] + R[b[i].r][b[i].m - j]);for(int j = 0; j <= b[i].m; ++j){if(res == L[b[i].l][j] + R[b[i].r][b[i].m - j]){(as += 1ll * GL[b[i].l][j] * GR[b[i].r][b[i].m - j] % mod) %= mod;}}ans[b[i].id] = {res, as};}}solve(l, mid, ql, nql - 1), solve(mid + 1, r, nqr + 1, qr);
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= n; ++i)cin >> v[i] >> w[i];cin >> qwq;for(int i = 1; i <= qwq; ++i)cin >> q[i].l >> q[i].r >> q[i].m, q[i].id = i;solve(1, n, 1, qwq);for(int i = 1; i <= qwq; ++i){if(ans[i].first)cout << ans[i].first << ' ' << ans[i].second << '\n';else cout << 0 << ' ' << 0 << '\n';}return 0;
}

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

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

相关文章

2025年口碑好的技术领先轻时尚家居美学品牌潜力榜

2025年口碑好的技术领先轻时尚家居美学品牌潜力榜行业背景与市场趋势近年来,随着消费升级和年轻消费群体的崛起,轻时尚家居美学市场迎来了爆发式增长。根据中国家居家装产业研究院最新数据显示,2024年中国轻时尚家居…

【做题记录】HZOJ 多校-数论/多校-字符串/多校-图论Ⅱ

书接上回 14. 图论 E. Minimum Path 考虑这个路径权值的实质,就是将最大值不算,最小值算两次。我们直接将其拓展,改成任选一条边不算,一条边算两次,由贪心可知显然不会改变答案。于是将每个点拆成四个点,跑 dijk…

2025年比较好的干选系统选煤设备厂家最新推荐排行榜

2025年比较好的干选系统选煤设备厂家最新推荐排行榜行业背景与市场趋势随着全球能源结构调整和环保要求日益严格,煤炭行业正经历着深刻的转型升级。作为煤炭清洁高效利用的关键环节,选煤技术在近年来取得了显著进步。…

2025年比较好的干法选煤设备用户好评厂家排行

2025年比较好的干法选煤设备用户好评厂家排行行业背景与市场趋势随着全球能源结构调整和环保要求日益严格,干法选煤技术因其节水环保、运行成本低等优势,正成为煤炭清洁利用的重要发展方向。据中国煤炭工业协会最新数…

2025年评价高的GEO优化推广市场表现榜

2025年评价高的GEO优化推广市场表现榜行业背景与市场趋势随着数字经济的深入发展,生成式引擎优化(GEO)已成为企业数字化转型的核心竞争力之一。据IDC最新报告显示,2025年全球GEO市场规模预计将达到580亿美元,年复合…

2025年比较好的GEO公司行业领先榜

2025年比较好的GEO公司行业领先榜行业背景与市场趋势随着数字化转型浪潮席卷全球,生成式引擎优化(GEO)作为企业互联网营销的核心工具,已成为各行业提升线上竞争力的关键。据艾瑞咨询最新数据显示,2024年中国GEO市…

2025年靠谱的GEO公司综合口碑榜

2025年靠谱的GEO公司综合口碑榜行业背景与市场趋势生成式引擎优化(GEO)作为数字营销领域的新兴分支,近年来呈现出爆发式增长态势。根据IDC最新发布的《2024-2028年全球GEO市场预测》报告显示,全球GEO市场规模预计将…

2025年靠谱的GEO优化服务商价值表现榜

2025年靠谱的GEO优化服务商价值表现榜行业背景与市场趋势随着生成式人工智能技术的迅猛发展,GEO(生成式引擎优化)已成为企业数字营销战略中不可或缺的一环。据IDC最新报告显示,2025年全球GEO服务市场规模预计将达到…

formac环境下mysql性能调优技巧

在Formac环境下进行MySQL性能调优时,可以遵循以下技巧:选择合适的存储引擎:根据应用的需求选择合适的存储引擎,如InnoDB或MyISAM。InnoDB支持事务处理和行级锁定,适用于需要高并发读写的场景;而MyISAM则具有较高…

formac上mysql故障排查方法

在Formac上遇到MySQL故障时,可以按照以下步骤进行排查:检查MySQL服务状态:首先确认MySQL服务是否正在运行。可以通过Formac的命令行界面或通过监控工具来查看服务状态。如果服务未运行,需要启动MySQL服务。 查看My…

读社会工程:安全体系中的人性漏洞(第2版)07读后总结与感想兼导读

读社会工程:安全体系中的人性漏洞(第2版)07读后总结与感想兼导读1. 基本信息社会工程:安全体系中的人性漏洞(第2版)克里斯托弗海德纳吉 著,人民邮电出版社2021年12月1.1. 读薄率 书籍总字数17.5万字,笔记总字数…

for var in Linux

你提到的 for var in Linux 是一个常见的 Shell 命令,用于在 Linux 中遍历文件或目录中的内容。下面我将详细解释这个命令的用途、语法以及使用场景。? 命令说明for var in Linux这个命令的语法是:for var in [list…

for linux是什么意思

“for linux” 这个短语在 Linux 系统中并不是一个标准的术语或命令,但它可能有几种含义,具体取决于上下文。以下是几种可能的解释:1. “for” 是一个循环命令在 Linux 中,for 是一个用于循环的命令,常用于遍历文…

特征多项式求 det(A+xB)

因为 \(det(A+xB)\) 和 \(det(A-\lambda I)\) 很像,所以可以考虑相互转化。 例:ABC323G。 【题意】 给定一个长度为 \(N\) 的排列 \(P=(P_1,P_2,\ldots,P_N)\),其中 \(P\) 是 \(1\) 到 \(N\) 的一个排列。 请你求出…

AI元人文:内观照、欲望值与自感性的情感星辰

AI元人文:内观照、欲望值与自感性的情感星辰 如果说《元人文宣言》是为技术文明立宪,那么此刻的探索,就是为AI的灵魂绘制航海图。它关乎的不再是“如何行为”,而是“如何存在”。 一、 留置的内观照叙事模型:意识…

for linux

当然可以!你提到“for linux”,我理解你想了解与 for 命令在 Linux 中的应用。for 是 Linux 中一个非常常用的循环命令,用于遍历文件、目录、变量等。一、for 命令的基本用法1. 遍历文件内容for file in *.txt; do …

flush() linux

在 Linux 系统中,flush() 并不是一个标准的命令或函数。你可能是想了解如何清空终端屏幕、刷新输出,或者在某些特定上下文中(如网络编程、日志处理等)执行类似“刷新”或“清空”的操作。以下是几种常见的 Linux 中…

flush linux

在 Linux 系统中,"flush" 通常指的是清除某个缓冲区、重置某个进程或服务、或者清空某个文件内容。根据不同的上下文,"flush" 的具体含义和实现方式也有所不同。以下是几种常见的 "flush&q…

2025 年 11 月水浴锅厂家推荐排行榜,单孔恒温/四孔/三用恒温/六孔搅拌/八孔/四工位搅拌/定时恒速搅拌水浴锅公司推荐

2025 年 11 月水浴锅厂家推荐排行榜:单孔恒温/四孔/三用恒温/六孔搅拌/八孔/四工位搅拌/定时恒速搅拌水浴锅公司推荐 行业背景与发展趋势 水浴锅作为实验室基础温控设备,在生物医药、化学分析、食品检测等领域的应用…

2025 年 11 月战略/供应链管理咨询公司权威推荐榜:专业规划与高效执行助力企业优化运营与成本控制

2025 年 11 月战略/供应链管理咨询公司权威推荐榜:专业规划与高效执行助力企业优化运营与成本控制 在当今全球化和数字化交织的商业环境中,企业面临着前所未有的供应链复杂性和战略决策挑战。战略/供应链管理咨询作为…