1月杂题
2023年了呢。
期末也终于考完了。
一.CF1336F Journey
题意:给你一棵 个点的树和上面的 条简单路径,问有多少对路径的交 。
。
做法:考虑两个路径有交时,lca 一定成祖先关系。
第一种情况:lca 不相等,简单,略。
第二种情况: lca 相等,且它们的交只有形如从 到 的一段。简单,略。
第三种,lca 相等,且交有两段。这个就比较困难了。
这个就是一个 。
我们把所有 的虚树建出来,进行一个启发式合并,那每次合并的时候就都要查一个形如:
的东西。
我们通过线段树维护 中的数的 dfn 序即可,查询就不难了。
所以合并的时候同样要对线段树进行修改,可以暴力插入?也可以线段树合并。
复杂度 。很巨大啊这个题,我写了 4.9k。
二.ARC064F Rotated Palindromes(加强版:[SDOI2018]反回文串)
题意:一个串合法的条件是有一个回文串和它循环同构。
给出 和 ,问你有多少个合法串满足长度为 ,每个位置都是正整数,且 。
。(加强:,多测,) 。
做法:感觉搞复杂了,但还是写写吧。
就是说可以考虑容斥。枚举集合 对于 , 是回文串。
令 。
改为枚举一个“环”差分数组满足 。
然后可以证明,为了满足条件,令 ,则 有一个长度为 的周期,证明略。
令 是长度为 的回文串个数,这个很好算。
则式子可列为: 的形式。
踢掉常数,枚举 ,变成
我们分类讨论:
第一种是 为偶数,则 一定是 的倍数。令 。
我们令 。
答案变成 。
通过莫比乌斯反演以及组合推导,令 ,则上式等于 。
第二种是 为奇数,此时 ,就更直接了:答案等于 。
每次算 速度可以做到 。 是 质因子个数。
如果用 pollard-rho 分解质因数,可以做到 。这个就是加强版了。
三. Baekjoon 19425 Line Counting
题意:有 个整点,每个 满足 。
问有多少条直线穿过了至少两个点。
多测, 。
做法:令 。当 时 。
通过数学推导可得答案为 。
展开多项式,分段计算。则我们需要计算 ,其中 。这是杜教筛练习题。
四. CF1630F Making It Bipartite
题意:有 个点,有互不相同的点权。如果 和 满足 是 的倍数,则从 往 连一条无向边。
求最少删掉多少点,使得图是二分图。
做法:有一个很好观察到的结论,就是如果不存在 满足 是 倍数, 是 倍数,那这个图就是二分图。
必要性显然,充分性可以反证一下。
结论换个说法,就是每个点只能连向比它小的点,或者比它大的点。
于是我们进行拆点建图,问题变成了 DAG 最长反链,就可以跑 Dinic 算了,复杂度 。
五.HDU6801
题意: 个石子排成环,你会从第一个石子开始进行操作,直到所有石子都被移走:
一. 以 的概率移走当前石子。
二. 移动到下一个还没有被移走的石子。
对于 ,求出第 个石子是第 个被移走的概率。
。
做法:枚举 是第几轮被删的,令 ,则答案的生成函数(这里我算反了,影响不大)可以写成:
。
考虑令 。
答案写成 。
踢开常数,二项式定理展开,交换求和顺序,可以得到
则等于
卷积计算即可。但是我们需要把 带进去,用二项式定理展开,计算。这是一个差卷积的形式。
六.codefestival 2016 final I Reverse Grid
神题!
题意:给你一个 的矩阵,每次可以翻转一列或一行,可以翻转若干次,求能得到多少种不同的排列。
。
做法:
首先它一定是 这四个位置的数在内部交换,我们称这是一个环。
我们考虑,如果依次操作第 行,第 列,第 行,第 列,那么它内部实现了位移,并且外部都是不变的。
可以通过程序验证,通过另外三个类似的操作,叠起来,可以得到 种不同的排列。这是非常神的一个构造。
我们令一个排列的奇偶性是 往 连一条边,环个数的奇偶性。则我们可以得到 种排列里所有为偶数的排列。
考虑一次翻转,对它覆盖到的环,奇偶性一定会改变。
得到结论:一个环,如果被覆盖偶数次,能造出 种排列,否则能造出另外 种。
需要注意的是,如果这 个位置有相同的数,则覆盖次数不影响,我们一定内部能构造出 种组合。
现在问题就变成了,有 个变量 和 个变量 ,
在不关心一些 的情况下,问能得到多少种不同的 序列。
我们把 看成一个 位的二进制数,则转化成, 个二进制数,求线性基大小。
利用 bitset 优化,复杂度 。太好了这个题,每一步都很神。
ps:其实最后一步纯粹是小丑啊。考虑对于一个需要关心的 ,从 往 连一条边。
那我们对于每一个连通块,随便取一个生成树,发现固定生成树上边的权值,其他的边也确定了,所以一个大小为 的连通块方案数就是 。
这就用并查集维护就好了。这个题复杂度是 的。
七.ARC153D Sum of Sum of Digits
题意: 是十进制下 的 popcount。给你 个正整数 ,求 的最小值。
做法:这么套路的题这点人过?这场打了就是起飞场啊。结果我在教室里做物理卷子卡选择题(
就是你从低位到高位确定 ,然后考虑每个 的进位。
填完 位后,把 按照 位拼起来的值从大到小排序,则 进位了的一定是一段前缀。
所以 记录 个数进位了,考虑到第 位,前 位这个 popcount 和 的最小值,转移一下就好了。
实现的好可以做到 。
八.LOJ2469 最小方差生成树 (80pts)
一个树的方差是所有边边权的方差。
题意:给你一个无向图和一个 ,如果 ,则 ,要求计算整个图的最小方差生成树权值;
否则 ,对于第 ,计算删掉第 条边后的最小方差生成树。
不保证联通,无生成树输出 。
做法:神题 。
首先方差可以看成 取到最小值。
一个 naive 的想法是,枚举可能的 ,直接计算 和 。本质不同的 有 个。这肯定是过不去的。
先把边从小往大排序。
我们考虑计算,一个边,在 处于什么范围时,会被选到最小生成树里。如果 ,则满足 的 ,会在 kruskal 时被先考虑。
(我们令 kruskal 时 为第一关键字,编号为第二关键字。)
所以我们把边从小往大排序后,计算从 到 ,依次加边,计算什么时候 和 联通,计为 ,则 。
同理可以计算一个 ,事实上不难证明 。则 。
计算 的过程就是一个求最大生成树的过程,从小往大加边,利用 LCT 把 到 的路径上最小的边给删掉。
这就是 了。复杂度 。
时,我们先同样计算出一个最小方差生成树,则除开这树上的 条边,删掉其它边都没有影响。
对于这 条边,我们考虑删掉一条边 ,其它边的 会怎么变化。
我们把 到 这些边的最小生成树 弄出来,不难证明只有这上面的边 会变化。但是怎么求新的 呢。
我们把 到 这些边的最大生成树 弄出来,从大往小把边加进 即可,当加入 使得 被删时,。
这一步事实上通过求最大/小生成树,排除了若干没用的边,把边的个数控制在 。
实现好的话就能做到 。事实上这里不需要 LCT 的,可以暴力实现,做到 。
至于为什么是 80 pts,我难得调高精了。
九.CF1783G Weighed Tree Radius
题意:给你一棵树(无边权)以及点权 。定义 , 。
有 次修改单点点权,每次修改后输出 的值。
做法:首先,如果点权都是 , 就是直径除以 上取整。
现在,我们在每个点上接两条长度为 的链。原树的 就是新树上点 能到达的最远距离。
把新树的直径求出来,则有 。可以证明,直径的中点 一定在原树上:
由于它是直径,则 , 。所以 , 不会在接的链上。
问题转化成求新树的 ,这是经典 ds 题啦。
十.ARC154E Reverse and Inversion
题意:给你一个排列 ,每次操作你会等概率的选择一个二元组 ,然后翻转 到 。
令 是 所有满足 的二元组的 的和。求 次操作后 的期望。
做法:
首先简化 。考虑把 拆开,令 ,则 。
令 ,则 , 。
综上, 。
接下来考虑一个值 所在的下标的期望。如果它从未被选中操作过,则下标是确定的。从未被选中的概率容易计算。
若被选中过,则下标的期望是 ,因为考虑它最后一次被操作,如果原来在 ,换到 的二元组个数是 ,换到 的个数是一样的。
这个题就做完了,复杂度是 。
十一.CF1687E Become Big For Me
题意:给你一个序列 ,你一开始有一个数 ,你可以选 的一个子集,令子集中的数的最小公倍数为 ,你可以使 ,或 。
使得最后 。给出一个方案。
, ,操作数不超过 次,每次选的集合的大小之和不超过 。
做法:神题!
首先,想求一组数的 gcd ,可以利用 min-max 容斥表示成一个 的形式构造出来。这是很重要的。
我们求 gcd 时只需要保留那些在某一个质数上次数最小的数。
的数不同质因子至多有 个。
如果任取一个数 ,那么除了它的 个质因子,其他质数的处理都只需保留 。
所以我们只需保留 个数。求 gcd 就只需要 次操作。
回到题目给出的式子,它是等于 的。
的 也只有 个。
这个题就做完了。令 ,操作数是 级别的。
十二. ARC153F Tri-Colored Paths
题意:给一个简单无向图三染色,使得存在一条简单路径包含了三种颜色,求方案数。 。
做法:
dfs 解决,下面令 。
我们先进行一步容斥:整个图至少有三种颜色,不存在包含三种颜色的简单路径的方案数。
我们考察一个环的染色情况。
- 环上有三种颜色。
case1: 长度 ,则一定存在一种颜色出现两次,割掉其中一条,存在了不合法路径。
case2: 三元环。
如果三元环上存在两个点 ,以及环外的 ,满足 和 间有边, 和 间有边,且 。
这个时候一定不合法的,读者可以自己画画看。
如果三元环上有至少两个点和环外的点有边,那一定会出现上面的情况(注意 )。
所以只能有一个点连接外面的边。可以发现外面的边都被染成了一种颜色。而且这个时候三元环一定是点双。
找出这样的三元环个数 ,则有方案 。
-----下面的情况中,只要有环有三种颜色,就视为不合法,这样能更方便。
- 环上有两种颜色,不妨令之为颜色 。则环外一定有一个颜色为 的边。
若这个边两个端点都在环内:一定不合法,读者自证不难。
否则,也一定不合法,读者自证不难。
------下面的情况中,所有环都只能有一种颜色。
- 此时,所有点双内的颜色都是相同的。我们把圆方树建出来。
一定存在一个圆点,与它相连的方点有至少两种颜色。经过一些推导(读者自推不难),发现删掉它之后,每个联通块内的方点颜色相同。
由此可以证明,只会存在一个圆点满足上面这个条件。
所以直接算就好啦。
复杂度 。
十三.ARC155E Split and Square
神神神。
题意:你有一个初始集合 ,然后你每次操作可以把 分成两个集合 和 。令 表示 ,则 ,把 变为 。
求最小操作数,使得 变成 。
题解:
考虑一次操作后线性基大小的变化。令 中的数线性基为 (这些数都出现在 中), 中包含 , 中包含 。
则 ,这些数一定是无法被互相表示的。所以大小至少为 。
另一方面,我们有这样的构造:把 中每个数都表示成, 到 中的数的一个子集。如果含有 ,则分到 ,否则分到 ,显然此时线性基大小至多为 。
考虑什么时候大小为 。通过 这些数,我们可以得到所有满足:
中选了偶数个, 中选了偶数个表示出来的数。我们不能使 含有其他数。
则分进 的数必须满足: 中选了奇数个, 中选了偶数个。 同理。
所以,一个数能分进 或 ,当且仅当它在 到 中选了奇数个。
综上,经过一次操作后线性基大小减少 ,当且仅当: 中所有数都能用奇数个线性基里的数表示出来。
但是,经过至少一次操作后的 含有 ,所以一定无法减少 。我们只需要判断初始的 是否满足条件即可。
复杂度是求线性基的复杂度: ,其中 表示 中的数值域在 之间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?