【CSP-J 2025】T4 多边形 polygon 题解

news/2025/11/16 22:20:13/文章来源:https://www.cnblogs.com/2021zjhs005/p/19229213

有史以来最水的 T4,我都会做。

形式化题面

给定一个长 \(n\) 的序列 \(\{a_i\}\)\(1\le n ,a_i \le 5000\)),你需要找到一个长度为 \(m\) 的子序列,记下标为 \(b_1,b_2,\dots,b_m\),满足:

  • \(m\ge 3\)

  • \(\sum_{i=1}^{m} b_i > 2 \times \max_{i=1}^{m} b_i\)

求满足条件的子序列 \(b\) 的数量,答案对 \(998244353\) 取模。

测试点信息:

::cute-table{tuack}

测试点编号 \(n \leq\) \(\max_{i=1}^{n} a_i \leq\)
\(1 \sim 3\) \(3\) \(10\)
\(4 \sim 6\) \(10\) \(10^2\)
\(7 \sim 10\) \(20\) ^
\(11 \sim 14\) \(500\) ^
\(15 \sim 17\) ^ \(1\)
\(18 \sim 20\) \(5\,000\) ^
\(21 \sim 25\) ^ \(5\,000\)

思路

考虑到这个 \(\max\) 很烦,我们想到把它搞掉,自然想到把 \(\{a_i\}\) 从小到大排序。

然后我们只要枚举最大值 \(a_i\)\(1\le i\le n\),注意这个是强制选择 \(a_i\)),相当于就是要求有多少个由 \([1 ,i - 1]\) 内的数组成的非空下标子集 \(S\),使得:

\[\sum\limits_{j\in S} a_j + a_i > 2a_i \]

即:

\[\sum\limits_{j \in S} a_j > a_i \]

但是这里不用考虑 \(m\ge 3\)

:::info[原因]{open}

显然 \(m = 1\) 就是只选择 \(a_i\) 一个数,那么肯定不满足 \(0 > a_i\)

\(m = 2\) 时相当于要找 \(1\le j < i\) 使得 \(a_j > a_i\),由于我们是升序排序,这个自然也不可能。

综上所述,\(m\) 的限制我们可以不用考虑。

:::

现在我们的流程如下:

  • 计算前 \(i - 1\) 个数所有的非空子集的和大于 \(a_i\) 的数量。

  • 把第 \(i\) 个数的贡献加上。

具体地,我们设 \(f_{i ,j}\) 为前 \(i\) 个数,凑出和为 \(j\) 的方案数,记答案为 \(ans\),那么每次统计答案(\(i\ge 3\))相当于:

\[ans\gets ans + \sum\limits_{j = a_i + 1}^{V} f_{i - 1 ,j} \]

其中 \(V = \sum a_i\),也就是所有数的和。

然后加上第 \(i\) 个数的贡献为:

\[f_{i ,j} \gets f_{i - 1 ,j} + f_{i - 1 ,j - a_i} \]

前面的是不选择 \(a_i\),后面的是选择 \(a_i\)

初始化 \(f_{0 ,0} = 1\)

时间和空间复杂度都为 \(\mathcal O(nV)\),其中 \(V\)\(\mathcal O(n\times a_i)\) 级别(由于 \(n\)\(a_i\) 同价,此处和下文默认为 \(\mathcal O(n^2)\) 哦),也就是 \(\mathcal O(n^3)\)

CCF 非常良心,给了几个 \(\max\limits_{i = 1}^n a_i = 1\) 的数据,这样 \(\sum a_i\) 就是 \(n\),时间复杂度为 \(\mathcal O(n^2)\)

注意到这边空间复杂度有点高,我们压缩一下,转移就为:

\[f_j \gets f_j+ f_{j - a_i} \]

这边 \(j\) 倒着枚举,\(f_j\) 对应上文 \(f_{i -1 ,j}\)\(f_{j - a_i}\) 对应上文 \(f_{i - 1 ,j - a_i}\),空间复杂度为 \(\mathcal O(n^2)\)。初始化 \(f_0 = 1\)

期望和实际得分都是 \(80\)

namespace lolcrying {signed main(){n = read();int sum = 0 ;up(i ,1 ,n) a[i] = read() ,sum += a[i];sort(a + 1 ,a + 1 + n);f[0] = 1;up(i ,1 ,n) {if(i >= 3) {up(j ,a[i] + 1 ,sum) ans += f[j] ,ans %= mod ; }dn(j ,sum ,a[i]) f[j] += f[j - a[i]] ,f[j] %= mod;}writeln(ans);return 0 ;}}

然后考虑正解。

我们发现这样做转移和统计答案都会 TLE,于是考虑优化(废话)。

观察到统计答案部分,我们自然想到用前缀和,即 \(\sum\limits_{i = 1}^{sum} f_i - \sum\limits_{i = 1}^{a_i} f_i\)

我们又想,此时如果可以快速计算前面的部分,后面的部分值域就是 \(a_i\)\(5000\)),这样转移也不用这么费时了。

仔细一想,发现前面部分真的可以 \(\mathcal O(1)\) 算,具体地,我们转化一下,前面就是总方案数。

那么总方案数就是前 \(i - 1\) 个数随便取或不取,去除空集,数量为 \(2^{i - 1} - 1\),前面可以快速幂做到 \(\mathcal O(\log mod)\),或者循环的时候直接做 \(\mathcal O(1)\)

然后转移和统计答案都是 \(\mathcal O(n^2)\) 了!

这种思想好像是正难则反。

这样,我们通过了 CSP-J 2025 T4(皆大欢喜)。

期望和实际得分都是 \(100\)

:::success[实现]{open}

namespace lolcrying {inline int qpow(int a ,int b){int res = 1;for( ; b ; a = a * a % mod ,b >>= 1) if(b & 1) res = res * a % mod;return res;} signed main(){n = read();up(i ,1 ,n) a[i] = read();sort(a + 1 ,a + 1 + n);f[0] = 1;up(i ,1 ,n) {if(i >= 3) {int total = 0 ;up(j ,1 ,a[i]) total += f[j] ,total %= mod; // 不合法数量。ans += (qpow(2 ,i - 1) - 1 - total + mod) % mod ,ans %= mod; // 总量 - 不合法数量。}dn(j ,5000 ,a[i]) f[j] += f[j - a[i]] ,f[j] %= mod; // 转移。}writeln(ans);return 0 ;}}

:::

其余无启发性子任务

  • \(n\le 20\) dfs 暴力。

  • \(a_i \le 1\) 你能发现任何 \(m \ge 2\) 的子序列都成立,答案即为 \(\sum\limits_{i = 3}^n \binom{n}{i} = 2^n - 1 - n - \frac{n(n - 1)}{2}\)

  • 其余不知道,但是都能用 \(80\) 的 DP。

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

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

相关文章

Django F对象完全指南:数据库层面的字段操作

一、F对象核心概念 1. 什么是F对象 F对象(F expression)是Django ORM提供的特殊查询表达式,用于直接在数据库层面引用模型字段值并进行操作。通过F对象,您可以:访问数据库字段值而无需加载到Python内存 执行字段间比…

如何计算一台服务器最大TCP连接数

在分布式系统和高并发场景中,服务器能支撑的TCP连接数直接决定了系统的承载能力。理解TCP连接的本质 每个tcp连接由四元组唯一标识:源ip地址 源端口 目标ip地址 目标端口对于服务器来说: 客户端ip可变 ------》 …

回退背包

回退背包问题(线段树分治): \(Content\): 给定\(n\)个物品,编号为\(i\)的物品有质量\(w_i\)和价值\(v_i\)以及一个体积\(V\)。初始时背包没有可选物体。 有\(m\)次操作,对于每次操作,给出一个整数\(op\)和\(x\)…

module jdk.compiler does not “以” com.sun.tools.javac.processing” to unnamed module

处理“module jdk.compiler does not “以” com.sun.tools.javac.processing” to unnamed module”错误的终极指南开发过程中遇到这个讨厌的错误,让你抓耳挠腮吗?别担心,你并不孤单。这个错误往往源于JDK项目版本…

nginx 响应html内容

设置ng返回的信息在页面显示 ngx.header.content_type = text/html; charset=utf-8 ngx.say("抱歉,您没有权限查看该监控! 如需开通权限,联系丁培倡/郑浩生添加") ngx.status = 403 ngx.exit(403)

Why cant Google appear in New York?

it just maybe is like Tencent can not appear in Bei Jing.

Django Q对象查询完全指南

引言:为什么需要Q对象 在Django中,当进行数据库查询时,我们通常使用filter()、exclude()等方法。但随着查询条件愈发复杂,尤其是需要组合逻辑或(OR)、逻辑非(NOT) 操作时,简单的过滤器链式调用会显得力不从心: #…

[AGC001E] BBQ Hard 分析

题目概述 给出 \(n\) 个 \(a_i,b_i\),其中 \(a_i\) 代表 \(0\) 的个数,\(b_i\) 代表 \(1\) 的个数,让你求对于所有的 \((i,j)(i<j)\) 这些 \(0,1\) 组合起来的本质不同的个数之和。 分析 思维好题! 首先我们不难…

logicFlow ,画布节点自定义

class CustomRectNode extends RectNode {/*** @description 重写此方法,自定义节点形状。* @returns VNode*/getShape() {const { model } = this.propsconst { x, y, width, height, radius } = modelconst style =…

哈希从入门到入土『给学弟学妹们讲课用的』

哈希是什么? 哈希本质就是一种映射,-

20232303 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验五实验报告

学校真好!

致敬《学校真是太棒了》。%%%%%%%%%%%%%%你们学校会在宿舍屎漫金山吗? 谁在宿舍写屎山? 我们高一尚慧楼会!西湖的水 我的泪 我情愿和你化作一团火焰Recently,尚慧楼一楼西侧的厕所蓄水池正式开启了回馈老玩家福利!…

NOIP2025模拟9

T1:卡门(kamen) 思路: 模拟。 据说可以用线段树和分块,但是咱还是选择最朴素的叽里呱啦一大坨子的预处理方式。 可以发现 \(c\) 极小,所以我们可以预处理出从第 \(x\) 列丢下去的石头能掉到的位置。 但是这里的部…

.net 8+, 类库无法引用 WebApplication 的解决方案

WebApplication 在 Microsoft.AspNetCore.Builder 下; 但是 nuget 上的 Microsoft.AspNetCore 只有 2.3 版本,导致无法在这个包中找到可用的 WebApplication 。 解决方法一:直接引用本地环境中的程序集 nuget 上有个…

2025-11-16

Problem - 1924A - Codeforces(构造) 要判断s字符串是否满足是所有前k个字符的子数组 则需要把s分段,每一段都包含前k个字符 如果段数>=n长度,即满足 否则,找最后一段不满足的字符 构造一个不满足的字符串 #in…

iOS移动端H5键盘弹出时页面布局异常和滚动解决方案 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P14092 [ICPC 2023 Seoul R] M. S. I. S.

这个结论还是太牛逼了。 首先你考虑一个事情,假设我目前存在一个重排列的方案,存在一列 \(i\),使得 \(a_i, b_i\) 都不选进答案,那么必然可以将其中较大的那一个移动到一个合适的位置使得获得 \(\max(a_i, b_i)\) …

【具身智能科普】表格分析核心概念、技术体系、应用场景落地、商业化等 - 指南

【具身智能科普】表格分析核心概念、技术体系、应用场景落地、商业化等 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…

深入解析:Hadoop 集群自动化运维实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …