ZJOI2022 做题记录
这一场质量挺高的。
D1T1 树
枚举第一棵树的叶子集合,第二棵树的叶子集合为恰好,容斥成钦定:( 为第一棵树叶子集合为 的方案数, 为第二棵树非叶子集合为 的方案数)
考虑对这个式子直接 dp,令 表示 dp 到了编号 的结点,目前前面钦定了 个非叶子结点,后面提前钦定了 个非叶子节点的容斥系数和。
分讨列出转移方程,大概就是枚举结点分配给哪棵树,然后再确定另一棵树是否钦定它来容斥(很神秘):
- 这个结点分配为第一棵树的叶子,第二棵树钦定:;
- 这个结点分配为第一棵树的叶子,第二棵树不钦定:;
- 这个结点分配为第二棵树的叶子,第一棵树钦定:;
- 这个结点分配为第二棵树的叶子,第一棵树不钦定:。
复杂度 。AC
D1T2 众数
显然答案的形态就是 aaabbbaaa,考虑对颜色出现次数根号分治:
- a/b 存在一个是大颜色:枚举每一个大颜色,扫一遍序列,对每种颜色维护一个极长的 aaabbb 段以及一个 bbbaaa 段即可。
- a/b 均为小颜色:枚举处于外面的颜色,那么问题转化为 次区间众数。但此时众数大小不超过根号,我们将询问有序地挂在右端点,枚举众数出现次数,移动右端点并维护符合条件最靠后的左端点,弹符合要求的询问就好了。
这样就做到了 。AC
D1T3 简单题
可以证明原图是一个杏仁树:对于每个环上只会有最多一对点能通过环外的路径互相到达,即每个点双都是杏仁。
我们对每个杏仁处理出 表示方案数,权值和。缩杏仁(有交点、连边的杏仁都要连边)之后,在树上随便合并一下这些 pair 就好了。
那么问题就是处理出一个点双的方案数与权值和了。也就是说,我们要计算一个杏仁上两个点之间的路径数及它们权值之和。
设杏仁链数为 ,链的权值和为 ,那么有:
- 若两个点在杏仁的一条链上,。( 为杏仁的两端)
- 若两个点不在杏仁的一条链上,类似地可以得到 。
然后就做完了,复杂度 。
D2T1 面条
将最后答案除以 ,那么我们第二个操作就不需要要除二了。
我们手玩一下操作过程:
(其中一个字母在不同阶段不代表相同数字)
也就是说,令 为 最低非零位,那么我们应用 次操作后,会变成很多个长度为 的相同段,最后接一个长度为 的相同段。
显然这个过程的操作与询问都可以在 内暴力模拟。
将长度为 的相同段缩成一个字母,令新的序列为 。考察接下来的操作造成的影响:
令差分数组为 ,那么操作就为:
那么,一次操作就是 的一次置换,令这个置换为 ,我们询问的答案就是:
可以简单计算出,后面这个式子考虑拆出所有置换环,每个置换环(设大小为 )通过一次卷积求出所有 的答案。
将大小相同的置换环的答案加到一起,每次询问只需要枚举 个置换环将答案加起来即可,复杂度 ,不能通过。
继续挖掘这个置换 的性质( 与 性质相同),手玩可以发现所有置换环大小都是 在 下的阶 的因数。
也就是答案关于 是循环的,那么我们将大小相同的置换环加和之后,直接维护 的答案就好了。
复杂度 ,可以通过。
D2T2 计算几何
首先进行一步转化,去掉所有坐标为偶数的点,将相邻的点连接成一个三角形点阵,它的对偶图每条边恰好可以对应回原图每个点,其最大匹配即为原图最大独立集。
通过霍尔定理可以观察出一定存在完美匹配!然后就是 P8114 [Cnoi2021]六边形战士 了。AC
D2T3 深搜
离散化,枚举一个 ,令权值大于等于 的点为黑点,那么我们就是要支持将一个点由黑染白,以及维护简单路径只经过黑点的点对,dfs 时不遇到白点的概率之和。
考虑将子树内有白点的点叫灰点,那么可以发现我们不能 dfs 入没有 的灰点子树。转移方程大概长这样:(令 为 的灰儿子数量)
这样我们就得到了一个 的解法。
直接将转移方程刻画成矩阵,每次加入白点的时候暴力更新非灰的祖先(更新单点的转移系数以及一条链的 ),用一个全局平衡二叉树就是 了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现