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 的博客 - 洛谷博客
随机推荐
- Django框架——Q查询进阶、ORM查询优化、事务操作、字段类型、字段参数、Ajax、Content—Type、ajax携带文件
Q查询进阶 from django.db.models import Q q_obj = Q() # 1.产生q对象 q_obj.connector = 'or' # 默认多个条件的连接是and可以修 ...
- 力扣14(java)-最长公共前缀(简单)
题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:strs = ["flower"," ...
- 力扣319(java)-灯泡开关(中等)
题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...
- DTCC 2020 | 阿里云赵殿奎:PolarDB的Oracle平滑迁移之路
简介: Oracle兼容性是业务客户从Oracle生态迁移到PolarDB生态的第一步也是至关重要的一步,PolarDB通过不断沉淀支持大量实际业务的真实Oracle兼容性功能,确保客户业务可以真正做 ...
- OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码
简介: 在数据库OceanBase3.0峰会上,蚂蚁集团自主研发的分布式数据库OceanBase首次从技术.商业和生态三个维度对未来发展战略进行了系统性阐述.同时,OceanBase宣布正式开源,并成 ...
- UCenter 1.6 数据字典
uc_admins 管理员权限表 字段名 数据类型 默认值 允许非空 自动递增 备注 uid mediumint(8) unsigned NO 是 用户ID username char(15) ...
- Spring如何控制Bean的加载顺序
前言 正常情况下,Spring 容器加载 Bean 的顺序是不确定的,那么我们如果需要按顺序加载 Bean 时应如何操作?本文将详细讲述我们如何才能控制 Bean 的加载顺序. 场景 我创建了 4 个 ...
- SQL使用ROW_NUMBER() OVER函数自动生成序列号
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说ROW_NUMBER()从1开始,为每一条分组记录返回一个数字,这里的ROW ...
- Flutter 多线程实现
异步Isolate实现多线程 最近在看Flutter开发相关知识点,对照着Android原生,探究了下多线程实现方式.在Flutter中有 Isolate,隔离,它的实现原理并不是内存共享的,它更 ...
- Android开发环境配置 JDK及SDK
已经搭建过无数次开发环境,今天把搭建环境记录下,下次不用去搜索别人博客,有些博客都是复制粘贴,有些关键信息都缺失了. 1.首先第一步:下载JDK,配置JDK环境变量.JDK可以在Oracle官网下载, ...