CF1827
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
求出每一个偶数的回文串。
观察可以发现:每一个合法的串都可以被划分为多个最小的合法串,并且划分方法是唯一的。
所以考虑如下:
我们需要维护出每一个点作为右端点,最靠近的左端点。
这等价于求出满足 \(i + p[i] \ge x\),求 \(\max i\)。
做法1:利用上面的限制,可以通过
ST
表求解。做法2:由于需要中心最大,所以逆序处理,利用每一个中心更新没有更新过的点。
由于每一个点只需要更新一次,考虑使用链表或者并查集维护。我用的是并查集。
然后,设上面对于端点 \(i\) 求出来的结果为 \(g_i\)。
得出最终的递推式:
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 的博客 - 洛谷博客
随机推荐
- 国内首家!百度智能云宣布支持Llama3全系列训练推理
继18日Llama3的8B.70B大模型发布后,百度智能云千帆大模型平台19日宣布在国内首家推出针对Llama3全系列版本的训练推理方案,便于开发者进行再训练,搭建专属大模型,现已开放邀约测试. 目前 ...
- 力扣453(java)-最小操作次数使数组元素相等(简单)
题目: 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 .返回让数组所有元素相等的最小操作次数. 示例 1: 输入:nums = [1,2,3]输出:3解释:只需要3次操作 ...
- 力扣1235(java)-规划兼职工作(困难)
题目: 你打算利用空闲时间来做兼职工作赚些零花钱. 这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]. 给你一份兼职工作 ...
- Dubbo 3.0 前瞻系列 | 2020双11,Dubbo3.0 在考拉的超大规模实践
很多开发者一直以来好奇:阿里自己有没有在用Dubbo,会不会用Dubbo?在刚刚结束的双11,我们了解到阿里云今年提出了"三位一体"的理念,即将"自研技术".& ...
- Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 2 应用级扩缩容
简介: 应用级扩缩容是相对于运维级而言的.像监控CPU/内存的利用率就属于应用无关的纯运维指标,针对这种指标进行扩缩容的HPA配置就是运维级扩缩容.而像请求数量.请求延迟.P99分布等指标就属于应用相 ...
- 链路分析 K.O “五大经典问题”
简介:链路分析是基于已存储的全量链路明细数据,自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求. 作者:涯海 链路追踪的 "第三种玩法" 提起链路追踪,大 ...
- Log4j漏洞不仅仅是修复,更需要构建有效预警机制
简介:软件的漏洞有时不可避免,根据Gartner的相关统计,到 2025 年,30% 的关键信息基础设施组织将遇到安全漏洞.日志服务SLS,可帮助快速部署一个预警机制,使得漏洞被利用时可以快速发现并 ...
- git fatal detected dubious ownership in repository 的解决方法
我换了一台电脑,将旧电脑的硬盘换到新电脑上:我装了双系统,切换到另一个系统时:我发现了 git 代码仓库无法执行 git 命令,不断报错 fatal: detected dubious ownersh ...
- dotnet Roslyn 通过读取 suo 文件获取解决方案的启动项目
本文来告诉大家一个黑科技,通过 .suo 文件读取 VisualStudio 的启动项目.在 sln 项目里面,都会生成对应的 suo 文件,这个文件是 OLE 格式的文件,文件的格式没有公开,本文的 ...
- WPF 加载诡异的字体无法布局
如果在系统里面存在诡异的字体,同时自己的 WPF 中有一个控件尝试使用这个字体放在界面中,那么将会在界面布局过程炸了,整个控件或者整个界面布局都无法继续 本文本来是由吕水大大发布的,但是他没空写,于是 ...