1月杂题
2023年了呢。
期末也终于考完了。
一.CF1336F Journey
题意:给你一棵 \(n\) 个点的树和上面的 \(m\) 条简单路径,问有多少对路径的交 \(\geq k\) 。
\(n\le 2*10^5\) 。
做法:考虑两个路径有交时,lca 一定成祖先关系。
第一种情况:lca 不相等,简单,略。
第二种情况: lca 相等,且它们的交只有形如从 \(lca\) 到 \(u\) 的一段。简单,略。
第三种,lca 相等,且交有两段。这个就比较困难了。
这个就是一个 \((d[lca(u_i,u_j)]-d[LCA])+(d[lca(v_i,v_j)]-d[LCA])\geq k\) 。
我们把所有 \(u_i\) 的虚树建出来,进行一个启发式合并,那每次合并的时候就都要查一个形如:
\(\sum\limits_{i\in S} [d[lca(v,i)]\geq A]\) 的东西。
我们通过线段树维护 \(S\) 中的数的 dfn 序即可,查询就不难了。
所以合并的时候同样要对线段树进行修改,可以暴力插入?也可以线段树合并。
复杂度 \(O(n\log^2 n)\) 。很巨大啊这个题,我写了 4.9k。
二.ARC064F Rotated Palindromes(加强版:[SDOI2018]反回文串)
题意:一个串合法的条件是有一个回文串和它循环同构。
给出 \(n\) 和 \(k\) ,问你有多少个合法串满足长度为 \(n\) ,每个位置都是正整数,且 \(\le k\)。
\(n\le 10^9\) 。(加强:\(n\le 10^{18}\),多测,\(T\le 10\)) 。
做法:感觉搞复杂了,但还是写写吧。
就是说可以考虑容斥。枚举集合 \(S\) 对于 \(i\in S\),\(c[i,n]+c[1,i-1]\) 是回文串。
令 \(S(b)=\sum b_i\) 。
改为枚举一个“环”差分数组满足 \(S(b)=n\) 。
然后可以证明,为了满足条件,令 \(V(b)=\gcd(S(b),\gcd\limits_{i=1}^l 2b_i)\) ,则 \(c\) 有一个长度为 \(V(b)\) 的周期,证明略。
令 \(f(n)\) 是长度为 \(n\) 的回文串个数,这个很好算。
则式子可列为:\(n\sum [S(b)=n]f(V(b))(-1)^{|b|-1}/|b|\) 的形式。
踢掉常数,枚举 \(V(b)\),变成 \(n\sum\limits_{k|n} f(k)\sum [S(b)=n][V(b)=k](-1)^{|b|-1}/|b|\)
我们分类讨论:
第一种是 \(n\) 为偶数,则 \(k\) 一定是 \(2\) 的倍数。令 \(N=n/2\) 。
我们令 \(Z(b)=\gcd(S(b),\gcd\limits_{i=1}^l b_i)\) 。
答案变成 \(n\sum\limits_{k|N} f(2k)\sum [Z(b)=1][S(b)=N/k](-1)(-1)^{|b|-1}/|b|\) 。
通过莫比乌斯反演以及组合推导,令 \(P(n)=\sum\limits_{d|n}\mu(d)d\) ,则上式等于 \(\sum\limits_{k|N} f(2k)kP(N/k)\) 。
第二种是 \(n\) 为奇数,此时 \(V(b)=Z(b)\) ,就更直接了:答案等于 \(\sum\limits_{k|n} f(k)kP(n/k)\) 。
每次算 \(P(x)\) 速度可以做到 \(δ(x)\) 。\(δ(n)\) 是 \(n\) 质因子个数。
如果用 pollard-rho 分解质因数,可以做到 \(O(n^{1/4}+\sigma(n)δ(n)\log n)\) 。这个就是加强版了。
三. Baekjoon 19425 Line Counting
题意:有 \(n(n+1)/2\) 个整点,每个 \((i,j)\) 满足 \(1\le i \le j \le n\) 。
问有多少条直线穿过了至少两个点。
多测,\(\sum n\le 2*10^9\) 。
做法:令 \(T(x)=x(x+1)/2\) 。当 \(x<0\) 时 \(T(x)=0\) 。
通过数学推导可得答案为 \(3\sum_{i=1}^n \varphi(i)(T(n-i)-T(n-2i))\) 。
展开多项式,分段计算。则我们需要计算 \(\sum_{i=1}^n \varphi(i)i^k\) ,其中 \(k<3\) 。这是杜教筛练习题。
四. CF1630F Making It Bipartite
题意:有 \(n\) 个点,有互不相同的点权。如果 \(i\) 和 \(j\) 满足 \(a_i\) 是 \(a_j\) 的倍数,则从 \(i\) 往 \(j\) 连一条无向边。
求最少删掉多少点,使得图是二分图。
做法:有一个很好观察到的结论,就是如果不存在 \(i,j,k\) 满足 \(a_i\) 是 \(a_j\) 倍数,\(a_j\) 是 \(a_k\) 倍数,那这个图就是二分图。
必要性显然,充分性可以反证一下。
结论换个说法,就是每个点只能连向比它小的点,或者比它大的点。
于是我们进行拆点建图,问题变成了 DAG 最长反链,就可以跑 Dinic 算了,复杂度 \(O(n\sqrt{n})\) 。
五.HDU6801
题意: \(n\) 个石子排成环,你会从第一个石子开始进行操作,直到所有石子都被移走:
一. 以 \(p\) 的概率移走当前石子。
二. 移动到下一个还没有被移走的石子。
对于 \(1\le i\le n\) ,求出第 \(c\) 个石子是第 \(i\) 个被移走的概率。
\(n\le 10^6\) 。
做法:枚举 \(c\) 是第几轮被删的,令 \(q=1-p\) ,则答案的生成函数(这里我算反了,影响不大)可以写成:
\((1-q)\sum_{i\geq 0}q^i(q^{i+1}x+(1-q^{i+1}))^c(q^ix+(1-q^i))^{n-1-c}\) 。
考虑令 \(y=x-1\) 。
答案写成 \((1-q)\sum_{i\geq 0}q^i(q^{i+1}y+1)^c(q^iy+1)^{n-1-c}\) 。
踢开常数,二项式定理展开,交换求和顺序,可以得到 \(\sum_{j\geq 0}\tbinom{c}{j}q^j\sum_{k\geq 0}\tbinom{n-1-c}{k}y^{j+k} \sum_{i\geq 0}q^{i(1+j+k)}\)
则等于 \(\sum_{j\geq 0}\tbinom{c}{j}q^j\sum_{k\geq 0}\tbinom{n-1-c}{k}y^{j+k} \tfrac{1}{1-q^{1+j+k}}\)
卷积计算即可。但是我们需要把 \(y=x-1\) 带进去,用二项式定理展开,计算。这是一个差卷积的形式。
六.codefestival 2016 final I Reverse Grid
神题!
题意:给你一个 \(n*m\) 的矩阵,每次可以翻转一列或一行,可以翻转若干次,求能得到多少种不同的排列。
\(n,m\le 200\) 。
做法:
首先它一定是 \((i,j),(n+1-i,j),(i,m+1-j),(n+1-i,m+1-j)\) 这四个位置的数在内部交换,我们称这是一个环。
我们考虑,如果依次操作第 \(i\) 行,第 \(j\) 列,第 \(i\) 行,第 \(j\) 列,那么它内部实现了位移,并且外部都是不变的。
可以通过程序验证,通过另外三个类似的操作,叠起来,可以得到 \(12\) 种不同的排列。这是非常神的一个构造。
我们令一个排列的奇偶性是 \(i\) 往 \(p_i\) 连一条边,环个数的奇偶性。则我们可以得到 \(24\) 种排列里所有为偶数的排列。
考虑一次翻转,对它覆盖到的环,奇偶性一定会改变。
得到结论:一个环,如果被覆盖偶数次,能造出 \(12\) 种排列,否则能造出另外 \(12\) 种。
需要注意的是,如果这 \(4\) 个位置有相同的数,则覆盖次数不影响,我们一定内部能构造出 \(4!/\prod c_i!\) 种组合。
现在问题就变成了,有 \(n\) 个变量 \(x_i\) 和 \(m\) 个变量 \(y_i\) ,\(a_{i,j}=x_i \operatorname{xor} y_j\)
在不关心一些 \(a_{i,j}\) 的情况下,问能得到多少种不同的 \(a\) 序列。
我们把 \(a\) 看成一个 \(O(nm)\) 位的二进制数,则转化成,\(n+m\) 个二进制数,求线性基大小。
利用 bitset 优化,复杂度 \(O(n^4/w)\) 。太好了这个题,每一步都很神。
ps:其实最后一步纯粹是小丑啊。考虑对于一个需要关心的 \(a_{i,j}\) ,从 \(i\) 往 \(j+n\) 连一条边。
那我们对于每一个连通块,随便取一个生成树,发现固定生成树上边的权值,其他的边也确定了,所以一个大小为 \(|S|\) 的连通块方案数就是 \(2^{|S|-1}\) 。
这就用并查集维护就好了。这个题复杂度是 \(O(n^2)\) 的。
七.ARC153D Sum of Sum of Digits
题意:\(f(x)\) 是十进制下 \(x\) 的 popcount。给你 \(n\) 个正整数 \(a_i\),求 \(\sum f(a_i+x)(x\geq 0)\) 的最小值。
做法:这么套路的题这点人过?这场打了就是起飞场啊。结果我在教室里做物理卷子卡选择题(
就是你从低位到高位确定 \(x\) ,然后考虑每个 \(a_i+x\) 的进位。
填完 \(j\) 位后,把 \(a\) 按照 \(j\) 位拼起来的值从大到小排序,则 \(a_i+x\) 进位了的一定是一段前缀。
所以 \(dp_{i,j}\) 记录 \(i\) 个数进位了,考虑到第 \(j\) 位,前 \(j\) 位这个 popcount 和 的最小值,转移一下就好了。
实现的好可以做到 \(O(10n\log A)\) 。
八.LOJ2469 最小方差生成树 (80pts)
一个树的方差是所有边边权的方差。
题意:给你一个无向图和一个 \(T\),如果 \(T=1\) ,则 \(1\le n\le m \le 10^5\) ,要求计算整个图的最小方差生成树权值;
否则 \(1\le n\le 300,1\le m\le 10^5\) ,对于第 \(1\le i\le m\) ,计算删掉第 \(i\) 条边后的最小方差生成树。
不保证联通,无生成树输出 \(-1\) 。
做法:神题 。
首先方差可以看成 \(\sum (x-a_i)^2\) 取到最小值。
一个 naive 的想法是,枚举可能的 \(x\) ,直接计算 \(\sum a_i\) 和 \(\sum a_i^2\)。本质不同的 \(x\) 有 \(O(m^2)\) 个。这肯定是过不去的。
先把边从小往大排序。
我们考虑计算,一个边,在 \(x\) 处于什么范围时,会被选到最小生成树里。如果 \(x\le a_i\) ,则满足 \(a_j\le 2x-a_i,j<i\) 的 \(j\) ,会在 kruskal 时被先考虑。
(我们令 kruskal 时 \((a_i-x)^2\) 为第一关键字,编号为第二关键字。)
所以我们把边从小往大排序后,计算从 \(i-1\) 到 \(1\) ,依次加边,计算什么时候 \(u_i\) 和 \(v_i\) 联通,计为 \(l_i\),则 \(x> (a_i+a_{l_i})/2\) 。
同理可以计算一个 \(r_i\) ,事实上不难证明 \(r_{l_i}=i\) 。则 \(x\in (\frac{a_i+a_{l_i}}{2},\frac{a_i+a_{r_i}}{2}]\) 。
计算 \(l_i\) 的过程就是一个求最大生成树的过程,从小往大加边,利用 LCT 把 \(u_i\) 到 \(v_i\) 的路径上最小的边给删掉。
这就是 \(T=1\) 了。复杂度 \(O(n\log n)\) 。
\(T=2\) 时,我们先同样计算出一个最小方差生成树,则除开这树上的 \(n-1\) 条边,删掉其它边都没有影响。
对于这 \(n-1\) 条边,我们考虑删掉一条边 \(i\) ,其它边的 \(l_j\) 会怎么变化。
我们把 \(i+1\) 到 \(m\) 这些边的最小生成树 \(T_1\) 弄出来,不难证明只有这上面的边 \(l_i\) 会变化。但是怎么求新的 \(l_i\) 呢。
我们把 \(1\) 到 \(i-1\) 这些边的最大生成树 \(T_2\) 弄出来,从大往小把边加进 \(T_1\) 即可,当加入 \(x\) 使得 \(y\) 被删时,\(l_y=x\)。
这一步事实上通过求最大/小生成树,排除了若干没用的边,把边的个数控制在 \(O(n)\) 。
实现好的话就能做到 \(O(m\log m+n(m+n\log m))\) 。事实上这里不需要 LCT 的,可以暴力实现,做到 \(O(n(m+n^2))\) 。
至于为什么是 80 pts,我难得调高精了。
九.CF1783G Weighed Tree Radius
题意:给你一棵树(无边权)以及点权 \(a_i\geq 0\) 。定义 \(e_u=\max\limits_{i=1}^n (dis(u,i)+a_i)\) ,\(r=\min\limits_{i=1}^n e_i\) 。
有 \(q\) 次修改单点点权,每次修改后输出 \(r\) 的值。
做法:首先,如果点权都是 \(0\) ,\(r\) 就是直径除以 \(2\) 上取整。
现在,我们在每个点上接两条长度为 \(a_i\) 的链。原树的 \(e_i\) 就是新树上点 \(i\) 能到达的最远距离。
把新树的直径求出来,则有 \(r\geq \left\lceil\dfrac{d}{2}\right\rceil\) 。可以证明,直径的中点 \(mid\) 一定在原树上:
由于它是直径,则 \(2a_u\le a_u+a_v+dis(u,v)\) ,\(a_u\le a_v+dis(u,v)\) 。所以 \(a_u\le \left\lceil\dfrac{d}{2}\right\rceil\) ,\(mid\) 不会在接的链上。
问题转化成求新树的 \(d\) ,这是经典 ds 题啦。
十.ARC154E Reverse and Inversion
题意:给你一个排列 \(p\),每次操作你会等概率的选择一个二元组 \(1\le i\le j\le n\) ,然后翻转 \(p_l\) 到 \(p_r\) 。
令 \(f(p)\) 是 所有满足 \(i<j,p_i>p_j\) 的二元组的 \(j-i\) 的和。求 \(m\) 次操作后 \(f(p)\) 的期望。
做法:
首先简化 \(f(p)\) 。考虑把 \(j-i\) 拆开,令 \(g(i)=\sum [j<i,p_i<p_j]-[j>i,p_i>p_j]\) ,则 \(f(p)=\sum ig(i)\) 。
令 \(x=\sum[j<i,p_i<p_j],y=\sum[j>i,p_i>p_j],z=\sum[j<i,p_i>p_j]\) ,则 \(x+z=i-1,y+z=p_i-1\) ,\(x-y=i-p_i\) 。
综上,\(f(p)=\sum i(i-p_i)\) 。
接下来考虑一个值 \(x\) 所在的下标的期望。如果它从未被选中操作过,则下标是确定的。从未被选中的概率容易计算。
若被选中过,则下标的期望是 \((n+1)/2\) ,因为考虑它最后一次被操作,如果原来在 \(i\) ,换到 \(j\) 的二元组个数是 \(\min(i,j,n+1-i,n+1-j)\) ,换到 \(n+1-j\) 的个数是一样的。
这个题就做完了,复杂度是 \(O(n\log m)\) 。
十一.CF1687E Become Big For Me
题意:给你一个序列 \(a_i\),你一开始有一个数 \(v=1\) ,你可以选 \(a\) 的一个子集,令子集中的数的最小公倍数为 \(x\),你可以使 \(v:=v*x\) ,或 \(v:=v/x\) 。
使得最后 \(v=gcd(a_ia_j)(1<i<j\le n)\) 。给出一个方案。
\(n\le 10^5\) ,\(a_i\le 10^6\) ,操作数不超过 \(10^5\) 次,每次选的集合的大小之和不超过 \(10^6\) 。
做法:神题!
首先,想求一组数的 gcd ,可以利用 min-max 容斥表示成一个 \(\prod lcm(T)^{(-1)^{T-1}}\) 的形式构造出来。这是很重要的。
我们求 gcd 时只需要保留那些在某一个质数上次数最小的数。
\(\le 10^6\) 的数不同质因子至多有 \(8\) 个。
如果任取一个数 \(x\) ,那么除了它的 \(\le 8\) 个质因子,其他质数的处理都只需保留 \(x\) 。
所以我们只需保留 \(\le 9\) 个数。求 gcd 就只需要 \(2^9-1\) 次操作。
回到题目给出的式子,它是等于 \((\gcd{ a_i })^2\prod\limits_{i=1}^n \frac{\gcd{a_j}(i!=j)}{\gcd{a_i}}\) 的。
\(\frac{\gcd{a_j}(i!=j)}{\gcd{a_i}} >1\) 的 \(i\) 也只有 \(\le 9\) 个。
这个题就做完了。令 \(m=9\) ,操作数是 \(O(m2^m)\) 级别的。
十二. ARC153F Tri-Colored Paths
题意:给一个简单无向图三染色,使得存在一条简单路径包含了三种颜色,求方案数。\(3\le n,m\le 2*10^5\) 。
做法:
\(n<5\) dfs 解决,下面令 \(n\geq 5\) 。
我们先进行一步容斥:整个图至少有三种颜色,不存在包含三种颜色的简单路径的方案数。
我们考察一个环的染色情况。
- 环上有三种颜色。
case1: 长度 \(\geq 4\) ,则一定存在一种颜色出现两次,割掉其中一条,存在了不合法路径。
case2: 三元环。
如果三元环上存在两个点 \(u,v\) ,以及环外的 \(x_1,x_2\) ,满足 \(u\) 和 \(x_1\) 间有边, \(v\) 和 \(x_2\) 间有边,且 \(u\ne x1,v\ne x2\) 。
这个时候一定不合法的,读者可以自己画画看。
如果三元环上有至少两个点和环外的点有边,那一定会出现上面的情况(注意 \(n\geq 5\))。
所以只能有一个点连接外面的边。可以发现外面的边都被染成了一种颜色。而且这个时候三元环一定是点双。
找出这样的三元环个数 \(C\) ,则有方案 \(6C\) 。
-----下面的情况中,只要有环有三种颜色,就视为不合法,这样能更方便。
- 环上有两种颜色,不妨令之为颜色 \(1,2\) 。则环外一定有一个颜色为 \(3\) 的边。
若这个边两个端点都在环内:一定不合法,读者自证不难。
否则,也一定不合法,读者自证不难。
------下面的情况中,所有环都只能有一种颜色。
- 此时,所有点双内的颜色都是相同的。我们把圆方树建出来。
一定存在一个圆点,与它相连的方点有至少两种颜色。经过一些推导(读者自推不难),发现删掉它之后,每个联通块内的方点颜色相同。
由此可以证明,只会存在一个圆点满足上面这个条件。
所以直接算就好啦。
复杂度 \(O(n+m)\) 。
十三.ARC155E Split and Square
神神神。
题意:你有一个初始集合 \(S\),然后你每次操作可以把 \(S\) 分成两个集合 \(T_1\) 和 \(T_2\) 。令 \(f(T)\) 表示 \(\{i \oplus j|i\in T,j\in T \}\) ,则 \(S'=f(T_1) \cup f(T_2)\) ,把 \(S\) 变为 \(S'\) 。
求最小操作数,使得 \(S\) 变成 \(\{0\}\) 。
题解:
考虑一次操作后线性基大小的变化。令 \(S\) 中的数线性基为 \(e_1,e_2,…,e_n\) (这些数都出现在 \(S\) 中), \(T_1\) 中包含 \(e_1,e_2,…,e_m\) ,\(T_2\) 中包含 \(e_{m+1},e_{m+2},…,e_n\) 。
则 \(e_1 \oplus e_2,e_1 \oplus e_3,…,e_1\oplus e_m,e_{m+1}\oplus e_{m+2},…,e_{m+1}\oplus e_n\) ,这些数一定是无法被互相表示的。所以大小至少为 \(n-2\) 。
另一方面,我们有这样的构造:把 \(S\) 中每个数都表示成,\(e_1\) 到 \(e_n\) 中的数的一个子集。如果含有 \(e_1\) ,则分到 \(T_1\) ,否则分到 \(T_2\) ,显然此时线性基大小至多为 \(n-1\) 。
考虑什么时候大小为 \(n-2\) 。通过 \(e_1 \oplus e_2,e_1 \oplus e_3,…,e_1\oplus e_m,e_{m+1}\oplus e_{m+2},…,e_{m+1}\oplus e_n\) 这些数,我们可以得到所有满足:
\(e_1,e_2,...,e_m\) 中选了偶数个,\(e_{m+1},e_{m+2},…,e_n\) 中选了偶数个表示出来的数。我们不能使 \(S'\) 含有其他数。
则分进 \(T_1\) 的数必须满足:\(e_1,e_2,...,e_m\) 中选了奇数个,\(e_{m+1},e_{m+2},…,e_n\) 中选了偶数个。\(T_2\) 同理。
所以,一个数能分进 \(T_1\) 或 \(T_2\) ,当且仅当它在 \(e_1\) 到 \(e_n\) 中选了奇数个。
综上,经过一次操作后线性基大小减少 \(2\) ,当且仅当:\(S\) 中所有数都能用奇数个线性基里的数表示出来。
但是,经过至少一次操作后的 \(S\) 含有 \(0\) ,所以一定无法减少 \(2\) 。我们只需要判断初始的 \(S\) 是否满足条件即可。
复杂度是求线性基的复杂度: \(O(nm^2/w)\) ,其中 \(m\) 表示 \(S\) 中的数值域在 \([0,2^m)\) 之间。