CF1827

A. Counting Orders

简单计数。

两个都排序,双指针维护一下 a[i]b[p] 的位置(a[i] <= b[p])。

那么方案数 \(\times (p - i)\)。

提交:https://codeforces.com/contest/1827/submission/211387552

C. Palindrome Partition

回文好题。

考虑利用 Manacher 求出每一个偶数的回文串。

参考:算法学习笔记(13): Manacher算法 - jeefy - 博客园

观察可以发现:每一个合法的串都可以被划分为多个最小的合法串,并且划分方法是唯一的。

所以考虑如下:

我们需要维护出每一个点作为右端点,最靠近的左端点。

这等价于求出满足 \(i + p[i] \ge x\),求 \(\max i\)。

然后,设上面对于端点 \(i\) 求出来的结果为 \(g_i\)。

得出最终的递推式:

\[f_i = \begin{cases}
0 &,g_i = 0 \\
f_{i - g_i} + 1 &, g_i \ne 0
\end{cases}
\]

其中 \(f_i\) 表示以 \(i\) 结尾的合法的串的个数。

最终的答案为 \(\sum f_i\)。

提交:Submission #211396680 - Codeforces

D. Two Centroids

性质好题。

重心有如下性质:

  • 最大子树大小 \(\le \lfloor \frac n2 \rfloor\)。

  • 新增一个叶子节点,重心最多变化一条边。

  • 重心至多有两个。

那么我们考虑每次加入一个点对于原来重心 \(c\) 的影响,并设当前最小的子树大小为 \(mx\)。

  • 如果加入的叶子节点在 \(c\) 的子树 \(t\) 内。更新 \(t\) 的大小,并更新 \(mx\)。如果此时 \(mx \ge \lfloor \frac n2 \rfloor + 1\),那么重心向 \(t\) 移动。并且此时 \(mx\) 更新为 \(\lfloor \frac n2 \rfloor\)(不考虑,把图画出来就明白了。

  • 由于我们不可能动态维护以每一个重心为根,所以还要考虑其祖先的情况(同理)。

然后就是如何找 \(t\) 的问题。有两种解决方案:

  • 无论如何首先可以通过 dfn 序判断是否在其子树内。

    • 方案1:利用倍增的方法跳祖先。空间复杂度 \(O(n \log n)\),单次 \(O(\log n)\)。

    • 方案2:利用 dfn 区间,对于每一个节点保存其子节点的 dfn,每次二分找到叶子的 dfn 所在的区间即可。(我用的这种方法)空间 \(O(n)\),单词 \(O(\log n)\)。

  • 实测第二种要快一点点(也快不了多少,主要是常数够好)

提交:Submission #211401150 - Codeforces

E. Bus Routes

差点没用 dlang 卡过去

思路1

考虑更严的限制(等价):叶子节点间两两可以在两次内到达。

于是考虑对于每一个叶节点,求出其能到达的最高的祖先 \(high(x)\)。

也就是求一个 LCA 即可。

那么满足条件的必要条件是每一对 \(high(x), high(y)\) 满足祖先/子节点关系。

如果不是,那么至少需要三条路径。

如果满足上述条件,那么所有的 \(high\) 满足在一条链上。

那么可以通过 dfn 序判断。

这并不充分。

考虑找到最低那个 \(high(x)\),并以 \(high(x)\) 作为根。

此时重新求一次 \(high\),如果所有的 \(high\) 都为 \(high(x)\),那么就是 \(ok\) 的,否则,如果有 \(high(y) \ne high(x)\),那么 \(x, y\) 不可达。

不要写倍增求 LCA,利用 ST表 \(O(n \log n) \sim O(1)\) 或者 树链剖分 \(O(n) \sim O(\log n)\) ,甚至是离线 \(O(n)\) 求。倍增太慢了,dlang 卡不过去。

思路2

参考 Alex_Wei 的博客:https://www.luogu.com.cn/blog/_post/575397

利用 DSU on tree

思路3

维护虚树并树上差分。非常的高效。

参考:CF1827E Bus Routes - Kubic 的博客 - 洛谷博客

随机推荐

  1. JavaServlet类

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 介绍Ser ...

  2. 揭秘sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术

    ​简介:解读集群镜像"开箱即用"神器--sealer! 编者按:集群镜像把整个集群看成一台服务器,把 k8s 看成云操作系统,实现整个集群的镜像化打包和交付,为企业级软件提供一种& ...

  3. 喜马拉雅 Apache RocketMQ 消息治理实践

    ​简介:本文通过喜马拉雅的RocketMQ治理实践分享,让大家了解使用消息中间件过程中可能遇到的问题,避免实战中踩坑. 作者:曹融,来自喜马拉雅,从事微服务和消息相关中间件开发. ​ 本文通过喜马拉雅 ...

  4. Serverless Kubernetes 落地实践

    ​简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践. 作者 ...

  5. [php-src] Php扩展开发的琐碎注意点、细节

    内容均以php-5.6.14为例. 函数中接收的字符串参数长度不包含结尾的0,在 zend_update_property 中,长度的参数是 int len,一般都使用 ZEND_STRL(NAME) ...

  6. [Gin] 路由分组 Group 的内部实现 与 块空间 { } 的应用

    通过这篇 [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin ) 我们知道了 gin.go 中的 Engine 继承有 routergroup.go 中的 Rou ...

  7. Fiddler 将插件放在独立子文件夹

    我的 Fiddler 安装了许多插件,有一些插件存在 DLL 名冲突问题,比如多个不同的插件都存在名为 PluginCore.dll 但实际实现逻辑完全不相同的程序集.这就导致了多个插件的安装之间,如 ...

  8. 后端每日一题 2:DNS 解析过程

    本文首发于公众号:腐烂的橘子 本文梗概: DNS 是什么,有什么作用 一条 DNS 记录是什么样的 DNS 域名解析原理 DNS 服务器如何抵御攻击 DNS 是什么,有什么作用 DNS(Domain ...

  9. 程序员天天 CURD,怎么才能成长,职业发展的思考 ?

    前言 关于程序员成长的话题,我前面写过一篇文章 - 程序员天天CURD,职业生涯怎么发展的思考. 现在回头看,对程序员这个职业发展的认识以及怎么发展还是有一些局限性.有一句话是这么说的:人的成长就是不 ...

  10. DNS(4) -- dns功能实现-配置正向解析和反向解析以及DNS递归查询示例

    目录 1 DNS配置示例 1.1 DNS解析类型 1.2 配置正向解析 1.3 配置反向解析 1.4 DNS递归查询 1.4.1 开启递归查询 1.4.2 关闭递归查询 1 DNS配置示例 1.1 D ...