当 hehe 蚤和网友面基成功时,网友可以跟着 hehe 蚤一起走。因此,任何面基方案必然可调整为最后一个时刻 hehe 蚤和所有网友处于同一位置的情况。
直接枚举每条边 ,检查它对答案带来的贡献。设第 个人到 的最短路为 ,则 在 这条边产生的贡献为左端为 ,右端为 的形如山峰(而非山谷)的折线 ,我们希望求 。
因为每条折线仅有至多一个顶点,所以 被 个顶点划分成若干段,每一段形如若干斜率为 的直线的 ,最小值容易求出。
时间复杂度 ,可以扫描线将 优化至 。代码。
你出的好,你出的好啊!
容易设计出状态 DP 表示当前匹配到最终串 的第 位,使用了 个 , 个 且匹配到原串 的第 位的方案数。因为 ,状态仅有 种。
考虑转移。初始想法是 贪心匹配 ,即枚举 ,若 ,则 ,否则若 且 ,则 ,否则若 且 ,则 。
问题在于这样贪心匹配不一定最优,因为对于某个 ,我如果令 ,就可以额外将 的限制放宽,放更多的 ,例如 ,,则上述 DP 无法统计到 。
考虑 反悔,即撤销 已经匹配的一些位置用于补充 使得 。考场上猜的结论是对每个 ,找到最大的 满足 (用于填补 的空缺), 是合法 串前缀,记为 ,则可以在 处撤销匹配至 处,且 全部投进 串匹配。
不会证明,但后来发现和官方从另一种角度考虑的题解本质相同。先给出转移式,最后再说明这一点。对于 ,枚举 ,则
- 若 ,转移至 ;
- 否则,若 ,转移至 ,当 时不可转移;
- 否则 ,若 ,则转移至 ;
- 否则需要撤销匹配,若 存在且 ,则转移至 ,否则不可转移。其中 表示 当中 的个数。
滚动数组优化, 根据 去掉,时间复杂度 ,空间复杂度 。代码。
结论正确性的疑点在于:
- 为什么 全部投进 串匹配,而不是匹配到 大于 的位置?
- 为什么 是合法 串前缀?因为 是归并插入当前 对应合法 串,所以似乎不需要合法。
官方题解 的定义是最大的 且 的 ,其中 为将 的 看成 , 看成 的前缀和,然后证明了 是合法 串前缀,且 是 新的最大匹配长度,即不存在 使得 可以由 和合法 串前缀归并得到,因而说明 需要全部投进 串匹配。
考察两种角度,显然官方题解更加严谨和完备。我的做法属于是本末倒置,瞎猫碰上死耗子恰好正确了。
不错的猫树分治练手题。
单组询问的 解法是经典问题,类似题目有 UVA12260 Free Goodies:设 表示 是否被选中, 表示 的前缀和,则对于任意 均有 。
因此,从前往后扫,每次往选中的数加入 和 ,但此时有 个数被选了,需要弹出最小的选中的数,容易证明反悔贪心正确。另一种思路是从后往前扫,每次往未被选中的数加入 和 ,并弹出最大的未被选中的数。两种思路分别支持开头扩展和结尾扩展,因此回滚莫队可以做到 ,压位 Trie 可以通过。直接做的复杂度为 ,只有 40 分。
既然支持开头插入和结尾插入,但无法快速合并,容易想到 二区间合并 即 猫树分治。
考虑合并两个区间 和 时,左边没选的数必然不会重新选择,右边选择的数必然不会不选,但我们会取消选择左边一些选择的数,转而选择右边一些未选择的数。因此,维护左边选择的数集 和右边未选择的数集 ,二分找到分界点,即最大的 使得 第 小的数小于 第 大 的数,然后将 前 小的数删去, 前 大的数选上,即为答案。
主席树维护,离线询问将空间复杂度优化至 ,时间复杂度 。代码。
非常好题目,英雄联盟,爱来自瓷器。
观察 的限制,容易想到用 减去 得到 。问题转化为找到两个 的子集 ,使得 且 ,则 即为一组合法方案。根据鸽笼原理, 只鸽子飞进 个笼子,必然存在两只鸽子飞进相同笼子,故必然有解。
问题在于如何找到这样的 ,赛时想了一年都没有想出来:如果要恰好找到 ,总枚举量为 ,无论如何 meet-in-the-middle
都无法减少枚举量到一个可以接受的范围。
那真的不能做了吗?当然不是。直接枚举 没有用到 的性质,考虑利用这一性质优化算法。
设 表示使得 的 的数量,问题即找出任意使得 的 。若存在 满足 ,称 合法。
核心结论:对于任意 的分割方式 和 ,必然存在至少一个区间 或 合法。
因初始区间 合法,所以二分,每次将当前合法区间长度减半, 次后即可找到长度为 的合法区间。故只需求使得 的 的数量。其相较于原问题枚举量减少了一半,总枚举量仅有 ,mitm 可以快速求解。
求得 后同样可 mitm 求出一组合法解,时间复杂度 。代码。
D2T2. 神隐
这题出得很好,让人思维出新。
考虑最朴素的做法枚举每条边,询问次数 ,很劣。
考虑 较小时的做法, 时我们必须询问每一条边,换言之,对于 ,必须:
- 存在一次询问使得 但 。
- 存在一次询问使得 但 。
若不存在第一种询问,,剩下一个点为 ,则我们无法确定 连向 还是 。
对任意 运用上述结论,可知还原整棵树的必要条件为对于任意相邻两条边 ,存在一次询问使得 但 ,存在一次询问使得 但 。因为我们不知道每条边的相邻情况,所以对于任意不同的两条边均需满足上述性质。
设第 条边属于集合 的询问,即 ,则上述性质可表述为对于任意 , 且 。如果构造出 ,也容易通过询问结果得到 。将所有无序点对 按照它们连通的次数 从大到小排序,做最大生成树即可:根据性质,非树边 的权值严格小于 到 简单路径上所有边的权值。
尝试构造 个两两互不包含的集合。如果限制了 次询问,最优方案为选择 所有 的数。,,可行。瓶颈在于 的时间复杂度。
考虑利用构造出的 的性质优化复杂度:每条边仅出现 次。
还原树的交互题有一个非常好用的技巧:剥叶子。每个叶子恰在 次询问中为孤立点,且条件充要,据此可不断剥掉 的叶子。
设最后一个被剥掉的节点为 ,上述过程给予我们 在以 为根时的拓扑序,考虑按拓扑序还原每个点的父亲。
设 的父亲为 ,容易发现恰有 次 与 不连通,即所属连通块其它点拓扑序均在 之后;同时恰有 次 与 连通,且根据性质, 所属连通块 的交恰好仅包含 和 。
关于树上连通块,有一个很好的性质是若干连通块相交,若交集非空,则交集深度最小的点为某连通块深度最小的点:若非,考虑交集深度最小的点 ,因其不为任何连通块深度最小的点,故 的父亲同样属于交集,矛盾。
因此,只需求出 每个连通块深度最小的点中深度最大的那个,即为 的父亲。容易维护。
时间复杂度 。代码。
咕了,如果进集训队就更。
UPD:来写了。
感觉思想挺简单的,但是是未曾设想的道路。
对 建出 SAM,则 是 的 border 当且仅当:
因为 的所有前缀形成 DAWG 上一条路径,考虑 DAG 剖分将路径拆成 条时间戳连续的重链,则问题转化成 次询问 到根的路径上时间戳落在某区间的节点的权值和,而 的权值即 。
- 如何拆重链:容易求出当前节点 到重链末尾形成的字符串在原串上的任意对应下标 。不妨设当前要匹配 ,则当前重链匹配长度即 ,容易 SA 或者 SAM 求出。
二维数点,离线后在树上扫一遍,用 BIT 维护单点修改区间查询。时间复杂度 ,代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现