当前位置: 首页 > news >正文

20260227 模拟测 总结

Preface

我为什么要浪费那么多时间在 T2 的假解上?换句话说,为什么我不能一开始就想到 T2 的正解???

我为什么要花费那么多时间在 T3 的调试上?换句话说,为什么我不能一开始就写对 T3 的细节???

时间分配问题。

我会 T4。


T1

估分 得分 挂分
\(100\) \(100\) \(0\)

个人评价:全场唯一水题。

注意到字典序的性质,最靠前的要分配最小的一定最优,于是我们用 map 随便乱搞就行了。

T2

估分 得分 挂分
\(100\) \(100\) \(0\)

我们要尽量使柴油不浪费,就先均分,均分后有剩下的柴油再让每台机器都 \(+1\)。不过显然无法把所有机器都 \(+1\),因为剩下的柴油是均分后的余数。

注意判断产出量上界 \(Q\) 以及机器启动下界 \(k\) 对计算过程的一些影响。

T3

估分 得分 挂分
\(100\) \(100\) \(0\)

怎么是,史山。

先把同种数字组成的序列所贡献的答案一把算掉。这可以用形似双指针的东西 \(O(n)\) 解决。

于是剩下的满足条件的,就一定是最大值 \(1\) 最小值 \(-1\)、或者最大值 \(2\) 最小值 \(-2\) 的区段了。

先考虑最大值 \(1\) 最小值 \(-1\)。为了使答案不重不漏,我们需要“有标志性地”去计算与求解,不妨让最小值 \(-1\) 贡献答案,且只让区段中最靠后的 \(-1\)(令其下标为 \(i\))贡献答案。

由于区段中必须存在 \(1\),直接考虑又非常麻烦,可以用容斥——具体地,我们用满足条件的区段中 \(i\) 左边有 \(1\) 的个数加上 \(i\) 右边有 \(1\) 的个数再减掉 \(i\) 左右两边都有 \(1\) 的个数即可求出 \(i\) 对答案的贡献。真绕……

分别求这三种类型的区段个数,只需要知道 \(i\) 前后离它最近的 \(1\)\(-1\) 的位置,以及 \(i\) 前后能延伸的最长的绝对值都是 \(1\) 的区间长度即可。这些显然都可以在最开始时线性预处理得到。注意一些细节和边界的处理。

最大值 \(2\) 和最小值 \(-2\) 的同理,求解方式很类似,只是算区段个数时不需要考虑什么前后延伸绝对值相等区间什么什么的了,之所以上面那个需要考虑是因为一旦锁死最大值 \(1\) 最小值 \(-1\) 则区段中一定不能出现绝对值为 \(2\) 的数,但这里不同,\(2>1\)\(-2<-1\),绝对值为 \(1\) 的数可以随意出现。

于是最后就做完了,只是细节比较多,写挂了有点难调。

我考场上发现大样例挂了之后使用和暴力解对拍的方式查出了好几个错。现在想来这也许就是当时最优的处理方案了……吧?

T4

估分 得分 挂分
\(50\) \(10\) \(40\)

死因:题目要求输出的是正整数但是我输出了一个浮点数,由于存在精度误差,一旦浮点数后面的小数位较多就会自动变成科学计数法,然后就挂没了。

唉唉,下次最后还是转成整数输出吧唉。

好了接下来讲正解。我必须说,这个题是真的不难。但是讲起来是真难。

以下令 \(dis\) 为题面中所述距离数组 \(a\),令 \(p\) 为题面中所述的距离数组平均数 \(x\)

\(n \sum (dis_i - p)^2\) 拆了,可得价值为 \(n \sum ({dis_i} ^2 ) - ( \sum dis_i ) ^2\)

考虑换根 DP。最初让 \(1\) 当根,也从 \(1\) 出发开始换根。

\(dp_u\) 为当 \(u\) 作为该树的根时的 \(\sum ({dis_i} ^2)\)\(f_u\) 为当 \(u\) 作为该树的根时的 \(\sum dis_i\)。有了这两个东西,就不难得出当 \(u\) 作为该树的根时整棵树的价值为 \(dp_u n - {f_u}^2\)

显然 \(dp\)\(f\) 的初值都是从根为 \(1\) 的情况那里得来的,可以跑一次 DFS 预处理 \(dis\) 数组。

接下来是转移。\(f\) 的转移是简单的:若要从 \(f_{fa}\) 转移到 \(f_{u}\)(其中 \(fa\) 是节点 \(u\) 的父节点),显然 \(u\) 子树内的节点所对应 \(dis\) 值统统 \(-1\)\(u\) 子树外的节点所对应 \(dis\) 值统统 \(+1\)。预处理子树大小 \(sz\),不难得到转移方程 \(f_u = f_{fa} - sz_u + (n-sz_u)\)

难点在于 \(dp\) 的转移。我们注意到普通的画图和推导已经对这个式子无能为力,只好开始推式子了。

为了方便推导与描述,我们令 \(dis'\) 数组为当 \(fa\) 为根时的 \(dis\) 数组经过重排后的结果,其中 \(dis'_1,dis'_2,\dots,dis'_{sz_u}\) 分别是 \(u\) 的子树上节点(也包括其自身)的 \(dis\) 值。

\[dp_u \]

\[= (dis'_1 - 1)^2 + \dots + (dis'_{sz_u} - 1)^2 + (dis'_{sz_u + 1} + 1)^2 + \dots + (dis'_n + 1)^2 \]

\[= ({dis'_1}^2 - 2 dis'_1 + 1) + \dots + ({dis'_{sz_u}}^2 - 2 dis'_{sz_u} + 1) + ({dis'_{sz_u + 1}}^2 + 2 dis'_{sz_u + 1} + 1) + \dots + ({dis'_n}^2 + 2 dis'_n + 1) \]

\[= ({dis'_1}^2 + {dis'_2}^2 + \dots + {dis'_n}^2) + n - 2 \sum_{i=1}^{sz_u} dis'_i + 2 \sum_{i=sz_u +1}^{n} dis'_i \]

\[= dp_{fa} + n - 2 \sum_{i=1}^{sz_u} dis'_i + 2 \sum_{i=sz_u +1}^{n} dis'_i \]

\[= dp_{fa} + n - 4 \sum_{i=1}^{sz_u} dis'_i + 2 \sum_{i=1}^{n} dis'_i \]

\[= dp_{fa} + 2 f_{fa} + n - 4 \sum_{i=1}^{sz_u} dis'_v \]

观察最后一个式子,我们发现,经过这样一番推导,最终只需要考虑所有在 \(u\) 的子树内的节点、在 \(fa\) 为根情况下到 \(fa\) 的距离之和!

考虑 \(sum_u\)\(u\) 的每个后代节点到 \(u\) 的距离之和,对于叶子节点 \(t\)\(sum_t = 0\),转移 \(sum_u = \sum_{v \in \text{son}(u)} sum_v + sz_u - 1\)。于是上面所需要的那个什么“所有在 \(u\) 的子树内的节点、在 \(fa\) 为根情况下到 \(fa\) 的距离之和”就是 \(sum_u + sz_u\) 了,因为 \(u\) 的子树内每个节点都要多走一步才能到 \(u\) 的父节点 \(fa\) 处。

整理一下,最终 \(dp\) 的转移式为:若要从 \(dp_{fa}\) 转移到 \(dp_{u}\)(其中 \(fa\) 是节点 \(u\) 的父节点),则有转移方程 \(dp_u = dp_{fa} + 2 f_{fa} + n - 4(sum_u + sz_u)\)

于是总共也就需要跑两次 DFS:第一次预处理,算出 \(sz,sum\) 两个数组并求出当 \(1\) 为根时的 \(dis\) 以初始化 \(dp_1\)\(f_1\);第二次换根 DP,按照转移方程

  • \(dp_u = dp_{fa} + 2 f_{fa} + n - 4(sum_u + sz_u)\)
  • \(f_u = f_{fa} - sz_u + (n-sz_u)\)

算出所有的 \(dp\)\(f\)

最终答案便是 \(\min_{i=1}^{n} dp_i n - {f_i}^2\)

代码贼短。

Summary

总结一下这次模拟测四道题的情况。

T1:啥事没有。

T2:以后一定要确保解法正确,不要脑子里冒出一个解,不管三七二十一就开编,这样真的会浪费很多时间,而且特别搞人心态。

T3:不要追求速度,写代码的时候写一行思考一行,尤其是你明知细节很多的情况,如果还不仔细考虑各种边界情况的话……我只能说调试实在是太耗时了。

T4:真的只是因为没时间了,我们算算,五点左后考试刚结束我花了 \(1\) 分钟左右时间给求答案的式子变了个形,回到家思考约 \(10\) 分钟就得到了正解,编代码顶多 \(5\) 分钟,而且没犯错无需调试,所以得出结论只要考试时长延长 \(20\) 分钟我就能 AK。所以这题没做出来真的只能怪 T2 T3 用时太久了吧!!!

其实总结起来就一句话:想清楚再写。

行吧,那就记个教训吧。

http://www.jsqmd.com/news/418208/

相关文章:

  • Python+flask爬虫电影信息分类管理与推荐系统 数据可视化大屏分析系统_b7vq98d8-vue pycharm django
  • 广州植发机构实测|告别脱发尴尬,焊死精致发际线 - 品牌测评鉴赏家
  • python+flask的校园电动车短租平台-vue pycharm django
  • Windows 上运行开源项目时启用Docker Desktop的优势
  • Scikit-learn包介绍
  • 选择智盈客CRM,让增长有“数”可依
  • 北京十大植发机构推荐|美发博主深耕5年,避坑指南+精准选型 - 品牌测评鉴赏家
  • 神经网络中的常用激活函数和优化器详解
  • 2026-02-27 闲话
  • 秃头不再慌!脱发救星大揭秘 - 品牌测评鉴赏家
  • 广州植发攻略|公立vs私立怎么选?宝藏机构+避坑指南,秃星人必看! - 品牌测评鉴赏家
  • Solutions P10417 [蓝桥杯 2023 国 A] 第 K 小的和
  • 北京植发哪里好?美发博主实测避坑!3类靠谱机构+不踩雷指南 - 品牌测评鉴赏家
  • 头顶脱发别慌!黑米纹发11大优势带你逆袭“高发际线” - 品牌测评鉴赏家
  • 北京植发机构实测推荐|亲测3家,避坑不踩雷,发量王者养成记 - 品牌测评鉴赏家
  • 艾利和 IRIVER D150 韩版拆机更换电池教程(附最新固件地址)
  • 艾利和 IRIVER D150 韩版拆机更换电池教程
  • 掉发严重别慌!植发不是唯一解,黑米纹发11大优势让你告别秃烦恼 - 品牌测评鉴赏家
  • 大面积脱发救星!别盲目植发了,纹发才是普通人的最优解 - 品牌测评鉴赏家
  • 植发vs纹发 11大维度硬核对比!脱发星人别再选错了 - 品牌测评鉴赏家
  • 植发原理彻底讲透!脱发党别盲目跟风,纹发或许更适合你 - 品牌测评鉴赏家
  • 【3 月小记】Part 1: Re: 树形 DP - L
  • 计算机毕业设计springboot在线答疑系统的设计与实现 基于SpringBoot的智能化课程辅导系统的设计与实现 基于SpringBoot的师生实时问答交流平台的设计与实现
  • 植发失败别崩溃,纹发为你指新道 - 品牌测评鉴赏家
  • Claude Code Skills |(1)安装使用指南(2026最新)
  • 2026.2.27
  • 计算机毕业设计springboot基于+大数据技术的中医康养预约系统 智慧中医药健康服务管理平台 传统医学康养诊疗一体化系统
  • Claude Code Skills |(2)开发进阶指南(2026最新)
  • Qt的控件 之二
  • NPM digital envelope routines::unsupported