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\)

我们先进行一步容斥:整个图至少有三种颜色,不存在包含三种颜色的简单路径的方案数。

我们考察一个环的染色情况。

  1. 环上有三种颜色。

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. 环上有两种颜色,不妨令之为颜色 \(1,2\) 。则环外一定有一个颜色为 \(3\) 的边。

若这个边两个端点都在环内:一定不合法,读者自证不难。

否则,也一定不合法,读者自证不难。

------下面的情况中,所有环都只能有一种颜色。

  1. 此时,所有点双内的颜色都是相同的。我们把圆方树建出来。

一定存在一个圆点,与它相连的方点有至少两种颜色。经过一些推导(读者自推不难),发现删掉它之后,每个联通块内的方点颜色相同。

由此可以证明,只会存在一个圆点满足上面这个条件。

所以直接算就好啦。

复杂度 \(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)\) 之间。

posted @ 2023-01-11 15:40  grass8woc  阅读(260)  评论(5编辑  收藏  举报