【杂题乱写】2024.02 #1
AtCoder-ARC171_D Rolling Hash#
区间 的哈希值不为零等价于:
由于 均为质数,且 ,所以上式等价于:
记 ,那么对于任意 ,容易还原出 ,也容易还原出原序列。所以只需要对 的限制考虑,发现每个限制等价于 ,那么直接状压就能求出结果。
提交记录:Submission - AtCoder
CodeForces-1929D Sasha and a Walk in the City *1900#
任选一个根,考虑在一个点集的 处统计答案。
为了方便,认为不包括的 点集选了虚根 。这样一个点集合法当且仅当除了 的节点都在 的同一子树内,否则选两个不同子树的和 就不合法了,同时除了 以外的节点也不能有祖孙关系。
考虑 DP,记 为 子树内选若干没有祖孙关系的节点方案数,转移是 。统计答案时发现就是 ,因此就是 。
CodeForces-1929E Sasha and the Happy Tree Cutting *2300#
明示了对 状压。发现 条路径形成的虚树一定是 规模的,所以本质不同的覆盖集合只有 个,直接离散化然后背包就行了。
CodeForces-1929F Sasha and the Wedding Binary Search Tree *2300#
有点水了,直接找到中序遍历,对每个极长未知段求方案数,答案就是关于长度和值域的组合数。
Luogu-P8860 动态图连通性#
容易发现每条边只有第一次询问是有用的,记第 条边的边权为首次被询问的时刻,如果从未被询问设成 。
考察所有 路径中最终留下的是哪一条,只有这条路径上的边不会被删去。首先路径中边权最小的一条,一定是要最小的尽量大,其他都先被删去了,最小的相等的所有路径中再比较次小,以此类推。所以是找所有路径中,升序排序后字典序最大的一条。
可以根据某条边是否出现来用二进制数表示一条路径,其中较小的边权放在较高的位上,所以是求一个高精度最短路,可以用主席树之类的解决,和某道 CodeForces 题类似。
本题具有一个特性:边权互不相同,考虑这个性质能不能指向一个更简单的做法。
假设 均可转移到 ,边权分别为 ,假设 ,也就是朴素 Dijkstra 中 先弹出。此时应当有 ,否则 比 先弹出,转移没有意义。观察 的二进制位,应当是有一个前缀相等,不相等的位置一定对应 ,所以 这一位是 , 这一位是 ,而 一定没有走 这条边,所以这一位也是 ,进而可以知道后面一定是 的更大。
那么如果 ,就会加在更高位,一定不优,如果 ,这个 一定不会产生进位,一定更优。所以转移实际只取边权最大的一个即可。
提交记录:Submission - Luogu
Luogu-P6845 CEOI 2019 Dynamic Diameter#
考虑用欧拉序来描述 的 。记 为 第一次出现的位置, 为欧拉序 对应节点的根链长度,那么 。由于减去区间的 等价于枚举区间内任意元素取 ,而要求的直径就是所有路径长度取 ,所以原题要求:。
容易用线段树维护区间信息,修改边权实际是对欧拉序区间的 进行修改。
另一种做法的第一步是比较容易想到的——线段树维护区间直径。合并两个区间是经典性质。带修看起来不好处理,但实际上只会影响同时包含 子树内外节点的区间,所以直接在线段树上重新递归 子树对应的 DFS 序区间就行了。
提交记录:Submission - Luogu
CodeForces-1930C Lexicographically Largest#
记 表示在取走 取走的位置 的元素个数,容易发现对于任意 ,这样的 都是合法的,证明考虑归纳,每次前 的元素的相对顺序不变,在操作序列的第 位置插入 即可。
也就是能构造出 的任意结果,容易发现集合中有重复元素一定不优。所以维护若干区间 ,初始是 ,每次取出右端点最大的中左端点最大的一个,将右端点加入答案集合,其余的右端点同样的最大的右端点减一。
CodeForces-1930D1 Sum over all Substrings (Easy Version)#
注意到一个 可以使左中右三个位置的 合法,即中间选自己,左右选长度为 包括中间的区间。由于每三个位置只会出现一个 , 的条件自然也满足了。
只需要固定左端点拓展一个右端点算答案就行了。
CodeForces-1930D2 Sum over all Substrings (Hard Version)#
考虑把 D1 的枚举左端点移动右端点改成批量算。
记 为以 开头所有区间的答案,从大到小枚举 DP。
如果 是 ,那么直接 。
如果 是 ,放置一个 可以直接把 的条件全部满足,于是 。
答案就是 。
CodeForces-1930E 2..3...4.... Wonderful! Wonderful!#
一个序列合法的充要条件是:有恰好 个位置被删去,且至少存在一个未被删去的位置左右都有 个位置被删去。证明是感性的,可以认为把最后一次操作还原之后的限制更松。
考虑枚举 ,不妨减去不合法的情况,此时从左往右第 个被删去的位置和从右往左第 个被删去位置中间应该都被删去,把它们缩成一个,就是有 个位置被删去。所以答案是 。时间复杂度是调和级数 。
CodeForces-1930F Maximize the Difference#
注意答案可以写成:
对每一位讨论,如果 与 相同, 任取均可;如果 为 而 为 , 取 ;如果 为 而 为 , 取 。所以实际上是 。
观察 发现就是 与 补 的交。朴素做法是 枚举子集。
由于只需要找到最大的同时为 与 中元素子集的值,所以每个值实际是标记,直接 BFS 就可以做到 。
作者:SoyTony
出处:https://www.cnblogs.com/SoyTony/p/18017013/Problems_in_February_2024_1
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-02-16 【游记】NOI 春季测试 2023