ZJOI2019
麻将
高级题。
首先考虑给定一个集合,如果判断它是否有一个子集是胡的。
考虑 ,设 表示当前是否有一对将,预留了 组 和 组 ,最多可以选出 对不同的对子的最大面子数量,于是就可以做了。
至于原题,设 表示考虑完 的麻将,选了 张牌,当前 的状态为 的方案数,然后转移就是按照 的转移。
但是这样的复杂度无法接受。考虑到 的可能的状态较少,可以构建一个自动机,状态即为 数组的状态,,然后在自动机上 即可。
设自动机的状态数为 ,时间复杂度为 。一般方法构建自动机的状态数在 之间,不过鱼大把自动机最小化了一手好像能做到 /jk
线段树
题目的意思就是求所有情况下最终 tag
为 的结点个数和。
根据传统,我们在一次 Modify
操作中把所有点分为五类:
- 会被递归到,且不再继续递归下去的点,即恰好被完全覆盖的点。
- 会被递归到,且继续递归下去的点。
- 不会被递归到,且被完全覆盖的点
- 不会被递归到,但是会被下传懒标记的点。
- 不会被递归到,也不会被下传懒标记的点。
设 表示答案, 表示 的路径上懒标记都为 的期望就可以做了。
时间复杂度 。
Minimax 搜索
不难发现我们只关注权值和 的相对大小关系,于是可以把 的数赋为 , 的赋为 , 的赋为 。
首先考虑判定问题。我们可以随意调整集合内的权值,设 表示以 为根的子树,最终可能的值域为 的集合数量,其中 ,那么就可以 了,时间复杂度 。
考虑对于一个集合,求出最小的代价。我们只需要求出使用 的代价不能使答案变化的方案数 ,则 。
我们把上面的 加上一维,设 表示以 为根的子树,代价 ,最终可能的值域为 的方案数,那么转移的话在 这一维就是 卷积,初值再修改一下,其余按照判定的转移即可,时间复杂度 ,可以通过 分。
发现 的时候只会改变 个叶子的 ,使用 可以做到 的时间复杂度,但是因为 两维有 种状态,所以还要带一个 的常数,无法通过。
考虑换一种思路。发现如果确定了代价为 ,那么调整的方案我们可以贪心地取:如果 和 的 深度为奇数,我们就把 的权值减去 ,否则加上 。我们把 这条链上的所有点删掉,设 表示 的子树内叶子节点个数, 表示 的子树内使得 的权值 的方案数, 表示使得 的权值 的方案数。
假设当前结点的深度为奇数,那么有
把重儿子单独拿出来,有
这是一个 的形式,具有结合律,于是就可以做了。
维护轻儿子积的时候需要记录 的个数。
代码待补。
开关
真的神仙题,不知道怎么想到的。
算法一
首先把初始状态和目标状态换一下,用一个集合表示当前状态中为 的位置,并不妨设 。
设 表示从状态 到状态 状态,即目标状态的期望步数,则 ;对于 ,我们有
其中 表示集合的异或。
这样我们得到了 个方程,直接做是 的。
这个方程可以手解。事实上,这个方程的解是
其中
证明:显然 时成立, 时,设:
我们只需证明 。考虑每个非空集合 对 的贡献:若 ,则 的贡献为 ,合起来就是 ;否则贡献为 。
所以
容易证明, 时有 。
所以上述的构造是正确的。而对于初始集合 ,我们有
发现 ,所以可以通过简单背包求出答案,时间复杂度 。
算法二
算法一太神了,让我们尝试从正面推导。
依然设 。
考虑容斥:设 表示 步以后恰好合法的概率, 表示 步以后合法的概率, 表示 步以后回到当前状态的概率,则有
我们设 表示三者的概率型生成函数,上面的等式就变成了
但是直接求 较为麻烦,我们发现可以求出 的指数型生成函数。具体地:
所以二者的 展开后都形如 ,而对于 ,我们只需要把 除掉的 乘回去,即
所以我们可以设 。
而 较小,我们可以通过 得出各项系数,所以我们就可以通过
求出答案了。
但很遗憾——这样做是错误的。因为当 时,,上式就没有意义了。
所以我们可以给分子分母同乘 ,此时 均收敛,那么
于是可以得到
可以直接计算了。时间复杂度 。
语言
果然还是第二题最可做。
发现对于固定的 ,合法的 构成了一棵连通子树,此处我们假设 也合法,考虑维护这棵连通子树。
一种方法是树剖加上扫描线那样的线段树,这样就是 。
发现我们只需要把过 的所有链的端点按照 顺序排成一圈,两两距离和除以 再加上 就是点数,所以我们可以直接用线段树合并维护过 的链的端点,加上 可以把时间复杂度降至 。
代码也十分好写。但是数据中存在 的情况,需要注意。
浙江省选
考虑 的情况,发现求一个半平面交就可以了。
考虑 的情况,此时我们要求最高排名为 的人,可以想到先把最高排名为 的人去掉,然后再求一遍半平面交,只要判断每条直线在半平面交所占的区间上是否存在一个点 ,使得 时排名第 。
于是我们求 次半平面交可以解决问题,考虑如何判定。发现一条被删掉的直线在半平面交上方肯定是一段区间,我们只需要把所有的区间求出来,差分以后排序扫一遍,就可以 实现一次判定了。
实现时需要注意的地方:
- 本题中 必须是自然数,所以在判断交点还有找 的时候需要注意取整。
- 排名的定义是使得 的 的个数 ,所以多条直线共点,甚至在半平面交上都只占一个点的情况也要考虑进去。
- 其他计算几何老生常谈的问题,比如手写分数类、直线的平行等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App