CF1753

成功因为虚拟机炸了,重新写一遍此文。

都是没有保存的错。

A. Make Nonzero Sum

由于 Note that it is not required to minimize the number of segments in the partition.。考虑每一段最小化……

可以发现,每一段都可以划分为长度为 1 或 2 的段。于是考虑影响。

只有长度为 2 的段会改变正负,不妨令 \(C_+, C_-\) 分别表示 1 和 -1 的个数,并假定 1 更多。

不难发现,只需要 \(\frac {|C_+ - C_-|}2\) 个长度为 2 的即可。

如果不是整数,那么直接判不可以即可。

由于有影响,考虑 DP。

设 \(f_i\) 表示考虑前 \(i\) 个数,最多能够放多少个长度为 2 的。

于是有

\[f_i = \max \begin{cases}
f_{i - 1} \\
f_{i - 2} + 1 &, a_i = 1
\end{cases}
\]

考虑在 DP 变化的地方放置长度为 2 的即可。

B. Factorial Divisibility

当时脑子抽了,用了两种合并的方法。

详见:https://codeforces.com/contest/1753/submission/211561532

但是实际上只需要通过 \(x! = x \times (x -1)!\) 合成即可(2048……

C. Wish I Knew How to Sort

假定有 \(C_0\) 个 \(0\),并且在前 \(C_0\) 个数中有 \(k\) 个 1。

那么考虑此时一个有效的操作,即是在前 \(C_0\) 中选择到了一个 \(1\),在后面中选择了一个 \(0\)。

有效的概率为

\[P_k = \cfrac {k^2}{n \choose 2}
\]

于是考虑状态转移,设 \(f_k\) 表示从前 \(C_0\) 个数中有 \(k\) 个 \(1\) 的状态转移到 \(0\) 个 \(1\) 的期望步数。

根据 markov 中的期望线性方程求解的方法,有

\[f_k = 1 + (1 - P_k)f_k + P_k f_{k - 1}
\]

稍微魔改一下,就变成了:

\[f_k = \frac {1}{P_k} + f_{k - 1}
\]

于是小小递推即可。

然而我当时是反着推的,无所谓,一样的:Submission #211560140 - Codeforces

D. The Beach

转换问题:等价于将两个 . 移动到一起的最小代价。

显然可以发现,一个障碍最多移动一次。

借用大佬的图:

于是我们可以考虑如此建图。跑一个最短路即可。

提交:Submission #211566195 - Codeforces

E. N Machines

非常恶心,虽然不是顶级难度。

最优的策略一定是把乘法向后移,把加法向前移。

思考 It's guaranteed that the current value of the resulting product does not exceed 2x10^9. 的意义。

发现,除去 \(\times 1\),最多只会有 \(\log C\) 个乘法。

于是考虑枚举其子集,为 \(2^{\log C}\)。所以需要优化。

有一个简单而优雅的剪枝:如果两个数相等,那么一定是选择最前面的。

由于 \(12! = 6227020800 \gt 2 \times 10^9\),所以其实最多只会有 \(O(2^{12})\) 种状态。

那么在钦定了向后移动的乘法后,我们需要找到前 \(rest\) 个移动到前面贡献最大的加法。

考虑二分移动到前面的贡献 \(\Delta\),在每一段再二分数量。

考虑如何计算每一个加法的 \(\Delta\) ?考虑加法移动前,其贡献为 \(x \times suf_x\),移动后的贡献为 \(x \times pre_x \times suf_x\)。

其中 \(suf_x\) 和 \(pre_x\) 是指乘法移动后,\(x\) 前面的乘法前缀积和后面的乘法后缀积。

于是 \(\Delta x = x \times (pre_x - 1) \times suf_x\)。

NOTICE

  • 二分 \(\Delta\) 时找到最大的 \(cnt > rest\) 的那个 \(\Delta\),由于多算了 \(cnt- rest\) 个,并且这些数的贡献一定是 \(\Delta\),所以再减去 \((cnt - rest) \times \Delta\) 即可。

  • \(\Delta\) 可能很大很大,所以上界大一点(我用的倍增,所以直接是从 \(2^{60}\) 开始向下……虽然没必要)

提交:Submission #211609810 - Codeforces

F. Minecraft Series

首先固定一个正方形,考虑贡献:将数分为正数与负数,分别计算 \(mex_p\) 与 \(mex_n\)。

正的为 positive,负的为 negative

于是贡献为 \(mex_p + mex_n - 1\)。

由于 \(mex\) 的单调性,发现包括合法正方形的正方形一定合法,所以考虑双指针维护所在最小合法正方形的。

注意,是在每一条对角线上来一发双指针,这样才能保证复杂度。

然后,然后就搞定了。

可以优化的是,\(mex\) 可以利用分块优化复杂度。

于是你可以得到一个复杂度为:

\[O(nm \cdot \min\{n, m\} + n m \sqrt k)
\]

的优雅 brute force……

提交:https://codeforces.com/contest/1753/submission/211685792

然而……不断的 TLE 让我怀疑人生,最后发现……

参考:讨论

随机推荐

  1. redis+lua脚本实现接口限流

    写在前面 在多线程的情况下对一个接口进行访问,如果访问次数过大,且没有缓存存在的情况下大量的请求打到数据库可能会存在数据库宕机,从而造成服务的不可用性.往往我们需要对其进行限流操作用来保证服务的高可用 ...

  2. element-ui多选(批量)删除

    导出axios请求

  3. 力扣585(MySQL)-2016年的投资(中等)

    题目: 写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数. 对于一个投保人,他在 2016 年成功投资的条件是: 他在 2015 年的投保额 (TIV ...

  4. HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置

    介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换. 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者 ...

  5. Flutter+FaaS一体化任务编排的思考与设计

    作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业务闭环.在新的研发模式落地与实践的过程中,一直在思考如 ...

  6. 当 TiDB 与 Flink 相结合:高效、易用的实时数仓

    简介: 利用实时数仓,企业可以实现实时 OLAP 分析.实时数据看板.实时业务监控.实时数据接口服务等用途.但想到实时数仓,很多人的第一印象就是架构复杂,难以操作与维护.而得益于新版 Flink 对 ...

  7. 当Java遇上机密计算,又一段奇幻之旅开始了!

    ​简介: 汪少军:如何为Java业务提供机密计算保护? ​ 写在前面 在信息世界里,数据存在三种状态: 存储态.传输态和计算态.存储在数据库或磁盘中的数据属于存储状态,在网络中传输的数据属于传输状态, ...

  8. 举例useContext性能低下的样例,同时推荐用什么方法改进

    在React中,useContext 是一种非常方便的全局状态管理工具,它可以让我们在组件之间共享状态,而不需要通过层层传递 props.然而,当我们在一个大型的 React 应用中过度使用 useC ...

  9. 记录几十页html生成pdf的历程和坑(已用bookjs-easy解决)(生成、转换、拼接pdf)

    懒得看的朋友,先说最终解决办法,主力为 前端依靠插件 bookjs-easy(点击直接跳转官网)并跳转到下面的第三点查看 接下来详细记录下整个试探的方向和历程 项目需求:是生成一个页数达到大几十页的p ...

  10. 二、Doris架构原理

    Doris是一个MPP的OLAP系统,以较低的成本提供在大数据集上的高性能分析和报表查询功能. MPP (Massively Parallel Processing),即大规模并行处理.简单来说,MP ...