QOJ #10485. Peculiar Protocol 题解

news/2025/9/18 16:04:17/文章来源:https://www.cnblogs.com/Scarab/p/19098980

Description

你有一个序列 \(a_1, a_2, \dots, a_n\),以及两个参数 \(d, r\)

你可以做如下操作若干次:

  • 每次选择一段区间,使得他们的和可以被表示成 \(k \times d + r\) 的形式,其中 \(k\) 是一个非负整数。
  • 你把 \(k\) 加入分数中,然后在序列中删去这一段,剩下的序列合在一起。

比如说 \(d=5, r=1\),序列为 \(2, 2, 2, 4, 4\)

  • 那么你可以删除 \(2, 2, 2\),获得 \(1\) 的分数。序列无法继续进行操作。
  • 你也可以删除 \(2, 4\),获得 \(1\) 的分数,序列变为 \(2, 2, 4\)。你可以继续删除 \(2, 4\),一共获得 \(2\) 的分数。

问最多可以获得多少分数。

\(n\leq 500,a_i,d,r\leq 10^8\)

Solution

首先这题显然是区间 dp。

有个想法是设 \(f_{l,r}\) 表示把 \([l,r]\) 删空的最小次数,转移时要枚举在最后一次操作之前删空了 \([l,r]\) 内的哪些子区间。

由于知道了操作次数就能知道剩余数模 \(d\) 的值,所以加一个状态 \(g_{l,r,k}\) 表示当前 \([l,r]\) 做了 \(k\) 次操作是否可行,暴力转移是 \(O(n^4)\)

注意到 \(g_{l,r,k}\) 中的 \(k\) 毫无意义,因为能够操作出来的操作次数一定是一段前缀,所以将状态改为 \(g_{l,r}\) 表示 \([l,r]\) 的最多操作次数即可,转移可以暴力转移。

时间复杂度:\(O(n^3)\)

Code

#include <bits/stdc++.h>#define int int64_tconst int kMaxN = 505;int n, d, r;
int a[kMaxN], f[kMaxN][kMaxN];
int64_t s[kMaxN], g[kMaxN][kMaxN];void dickdreamer() {std::cin >> n >> d >> r;for (int i = 1; i <= n; ++i) {std::cin >> a[i];s[i] = s[i - 1] + a[i];}memset(f, 0, sizeof(f));memset(g, 0, sizeof(g));for (int len = 1; len <= n; ++len) {for (int i = 1; i <= n - len + 1; ++i) {int j = i + len - 1, sum = s[j] - s[i - 1];for (int k = i; k < j; ++k) f[i][j] = std::max(f[i][j], f[i][k] + f[k + 1][j]);if ((sum - r * f[i][j] % d + d) % d == r) ++f[i][j];for (int k = 1; k <= f[i][j]; ++k) {if (k * r % d == sum % d) {g[i][j] = (sum - k * r) / d;break;}}// std::cerr << i << ' ' << j << ' ' << f[i][j] << ' ' << g[i][j] << '\n';}}// std::cerr << "??? " << f[3][4] << ' ' << f[2][5] << '\n';for (int i = n; i; --i) {for (int j = i; j <= n; ++j)for (int k = i; k < j; ++k)g[i][j] = std::max(g[i][j], g[i][k] + g[k + 1][j]);}std::cout << g[1][n] << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

C++ 常用关键字

1. static 控制作用域、生命周期或类成员归属 // 1. 全局/命名空间:仅当前文件可见(避免跨文件重定义) static int global_static = 10; // 其他文件无法通过 extern 访问// 2. 局部变量:生命周期延长至程序结束(…

vim 入门教学2

vim 入门教学2normal模式 normal模式markm{a-zA-Z} 给当前行做标记{a-zA-Z},如果使用大写字母可以跨文件跳跃 {a-zA-Z} 将光标跳转到{a-zA-Z}的行首跳转到上次使用跳转的位置例子: ma 将当前行标记为a a 跳转到a标…

【AP出版】第四届数理统计与经济分析国际学术会议 (MSEA 2025)

第四届数理统计与经济分析国际学术会议 (MSEA 2025)将于2025年12月05-07日在中国广州召开。【高录用快见刊:最快一周内即可录用,会后3-4个月见刊】 【征稿范围:数理统计、经济分析大方向主题均可收稿】 第四届数理统…

数据结构 Trick 之:区间子区间计数

能够解决的问题\(O(n \log n)\) 可过。 维护数列,无修改,每次查询一个区间的所有子区间。 离线思路 看到一个区间的所有子区间这种查询,直接做显然是做不了的。 考虑离线,那么将询问区间进行右端点排序,然后就可以…

mapstruct.Mapper|Mapping详解

------------------------------------------------------------------------------------------ org.mapstruct.Mapper 和 org.mapstruct.Mapping 是 MapStruct 框架中的核心注解,用于实现 Java 对象之间的自动映射。…

抽象代数-学习笔记

主要积累一些遇到的例子、题目。不定时更新。 运算有结合律的运算:普通/复数/矩阵/模意义下加法、乘法,映射复合,与或异或/集合相关, min/max。 仅仅满足部分群公理:\(\mathbb{N}^*, \mathbb{N}\)。\(\{0,1,2\}\)…

如何在保证质量的前提下,快速完成一份 PPT?

这是一个非常经典且普遍的问题,尤其对于产品经理、咨询顾问等角色来说,PPT既是生产力工具,也是时间吞噬黑洞。你能意识到这个问题并寻求解决方案,已经领先了很多人。 在保证质量的前提下快速完成PPT,绝非单纯追求…

XXL-JOB(3)

XXL-JOB(3)开发Bean模式(基于方法)Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务…

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 - 若

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 前言 ClickHouse 作为高性能的列式数据库,其表引擎设计是其核心优势之一。ReplacingMergeTree 是处理重复数据的利器,而 PA…

UOS统信服务器操作系统V20(1070)安装mysql8.4.5(建议安装glibc2.28版本)

环境:OS:UOS Server 20 统信服务器操作系统V20(1070)mysql:8.4.5 glib.2.17 操作系统下载https://www.chinauos.com/resource/download-server查看系统glibc版本[root@localhost yum.repos.d]# ldd --versionldd (GNU …

web5(phps源码泄露)

访问index.phps,会自动下载index.php文件 点击查看即可得到flag

web3(自带网络工具包查看数据)

查看源码什么也没有扫目录也什么都没有只能说信息收集能力还欠佳, 我们可以先尝试使用浏览器自带的网络工具查看一下数据包。

web17(备份的sql文件泄露)

用常见的数据库工具打开即可

web11(通过Dns检查查询Flag)

:::info 223.5.5.5测试的解析结果是否具有代表性?(来自阿里云官网)具备一定的代表性,在国内客户端使用223.5.5.5有一定的用户群体,但是该测试结果并不能代表全部用户;如果223.5.5.5测试已经生效,但是您本地仍然不…

ctfshow_web11

ctf.show_web11简单的代码审计,这段代码定义了一个名为replaceSpecialChar的函数,该函数接受一个字符串$strParam作为参数。函数内部使用了正则表达式$regex来匹配SQL语句中的一些关键字,包括select、from、where、…

ctfshow_web13

ctf.show_web13今天也算是碰到一个新类型的文件上传类的题目(与文件包含结合了可以说)首先尝试了直接传一句话木马,全都被ban了,算是没招了就扫了下目录,进去看一眼,好像页面没回显什么东西,再试试看upload.php…

ctfshow_web9

ctf.show_web9尝试爆破无果,应该不是弱口令爆破题,那么我们就扫一下目录进去看看访问该目录后会自动下载一个php文件,打开看看可以看出这是一个sql注入漏洞,通过post传参一个paasword的变量值。经过md5加密后被用来…

强烈推荐 | 阿里开源的这11个神级项目

前言 最近趁着国庆节放假休息,特地整理了一下,阿里巴巴开源的10款神级项目。 这些开源项目中的绝大多数,我都在实际工作中用过,或者有同事用过。确实挺不错,挺有价值的,现在推荐给大家。 1. Druid Druid自称是Ja…

pom 依赖

</build> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifa…