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 的博客 - 洛谷博客
随机推荐
- Android Native crash 处理案例分享
简介: Android Native crash 处理案例分享 1. 背景 目前 mPaas[1] Android使用Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一 ...
- 新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析
简介: 作为新型反射类型,目前仍存绕过防御可能性. 阿里云安全近期发现利用STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)服务发起的DDoS反 ...
- OpenKruise v0.10.0 新特性 WorkloadSpread 解读
简介: 针对需求,OpenKruise 在 v0.10.0 版本中新增了 WorkloadSpread 特性.目前它支持配合 Deployment.ReplicaSet.CloneSet 这些 wo ...
- Serverless 工程实践 | Serverless 应用开发观念的转变
简介: Serverless 架构带来的除了一种新的架构.一种新的编程范式,还包括思路上的转变,尤其是开发过程中的一些思路转变.有人说要把 Serverless 架构看成一种天然的分布式架构,需要用 ...
- [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:app\index\controller\Api
当在 TP5 入口中简单使用 define('BIND_MODULE','index') 绑定默认模块后,访问 api 模块会提示: 控制器不存在:app\index\controller\Api 这 ...
- dotnet UNO 如何在调试下输出界面层级结构
本文将告诉大家如何在 UNO 里面将界面的层级结构输出到调试窗口 实现方法非常简单,和 WPF 或 UWP 等的方法是一样的,那就是通过可视化树遍历的方式,如以下代码 static class UIS ...
- 🎉 Socket.D v2.4.12 发布(新增 python 实现)
Socket.D 协议? Socket.D 是一个网络应用协议.在微服务.移动应用.物联网等场景,可替代 http.websocket 等.协议详情参考<官网介绍>. 支持: tcp, u ...
- 实验8 #第8章 Verilog有限状态机设计-1 #Verilog #Quartus #modelsim
8-1 流水灯控制器 1. 实验要求:采用有限状态机设计彩灯控制器,控制LED灯实现预想的演示花型. 2. 实验内容: (1)功能:设计彩灯控制器,要求控制18个LED灯实现如下的演示花型: 从两边往 ...
- Oracle和达梦:循环执行SQL(如循环插入数据)
Oracle和达梦:循环执行SQL(如循环插入数据) 其中:WHILE i <= 100000 LOOP,10万是循环10万次 其中:i NUMBER := 1;,1是从一开始 -- 循环执行一 ...
- (更新中)Python、JavaScript、Java和C++语言的语法对比与梳理
目录 引言 1. 构造函数 Python JavaScript Java C++ 2. 构造类 Python JavaScript Java C++ 3. 总结 引言 在开发过程中不免需要用到多种编程 ...