Loading

2024.1 记录

1.10

HDU 6791. Tokitsukaze, CSL and Palindrome Game

经典结论是,

\[E(S)=\sum_{i\in \operatorname{border}(S)} 26^i. \]

并且一个回文串的所有 border 就是 PAM 上它的所有祖先。于是比较 \(E(S)\)\(E(T)\) 的大小只需要在 PAM 上倍增。时间复杂度 \(O((n+q)\log n)\)

CF1483F. Exam

枚举大串 \(s_i\) 的每个前缀 \(s_i[1,p]\),可以用 ACAM 找到最长的串 \(s_j\) 使得 \(s_j\)\(s_i[1,p]\) 的后缀。小串的候选集合就是这 \(|s_i|\)\(s_j\)

把这些 \(s_j\)\(s_i\) 中的出现区间画出来,那么所有完全被另一个区间包含的 \(s_j\) 就可以删掉。对于还没被删掉的串,统计其在 \(s_i\) 中出现了多少次,如果出现次数等于它作为最长后缀出现的次数,那么 \((s_i,s_j)\) 是一个答案。

统计出现次数需要用树状数组,时间复杂度 \(O(\sum |s_i|\log \left(\sum |s_i|\right))\)

CF1276F. Asterisk Substrings

子串内 \(*\) 在边上或者不存在 \(*\) 的情况是好统计的。

考虑 \(A*B\) 这个字符串是不是集合内某个字符串的子串。建出正串后缀树和反串后缀树,设 \(A\) 在反串后缀树上对应的节点是 \(u\)\(B\) 在正串后缀树上对应的节点是 \(v\),只要 \(\exists x\in \operatorname{endpos}(u),x+2\in \operatorname{endpos}(v)\) 即可。

所以反串后缀树上一个节点对答案的贡献,就是它的 \(\operatorname{endpos}\) 在正串后缀树上的链并。用树链剖分和线段树合并维护子树链并的大小即可。\(O(n\log^2 n)\)

CTSC 2016. 香山的树

以下认为对于一个串 \(s\),如果 \(i>|s|\),则 \(s[i]=s[i-|s|]\)

考虑计算以一个串 \(t\) 为前缀的,长度不超过 \(n\) 的满足条件的串 \(s\) 的个数。有两种情况:

  • \(t<s[i,i+|t|-1]\)
  • \(t=s[i,i+|t|-1]\)\(s[t+1,|s|]<s[i+|t|,|s|]\)

发现不必限制得如此严格:只需要 \(t\le s[i,i+|t|-1]\),然后只要 \(s\) 不是循环串,就只有恰好一个位置 \(i\) 使得 \(s[i,|s|]s[1,i-1]\) 是满足条件的,且这个位置一定是 \(t\) 的某个出现位置。

可以在 KMP 自动机上进行 DP,记录当前匹配到自动机上的哪个节点,以及 \(t\) 完整地出现了多少次(这里也需要考虑 \(s\) 的一个后缀拼上一个前缀等于 \(t\) 的情况)。设 \(t\) 出现了 \(c\) 次,对答案的贡献系数就是 \(\frac{1}{c}\)

还需要去除循环串的贡献。设 \(g_i\) 表示长为 \(i\) 的非循环串,且无限循环后以 \(t\) 为前缀,且满足 \(t\le s[i,i+|t|-1]\) 的串的个数。

如果 \(i\le |t|\),那么只有在 \(t[1,i]\)\(t\) 的周期且 \(t[1,i]\) 本身满足条件的时候,\(g_i=1\)

对于 \(i>t\),需要减去每个 \(j<i\)\(j\mid i\)\(g_j\) 的贡献。这里的贡献系数一定是 \(\frac{j}{i}\),因为 \(g_j\) 表示的是非循环串,而每个 \(g_j\) 表示的串内 \(t\) 都出现了恰好一次。

回到原来的问题,只需要先枚举与 \(S\) 的 LCP 长度,再枚举下一个字符填什么,然后用上面的方法计算即可。

1.14

ABC336G. 16 Integers

构造一个 \(8\) 个点的图 \(G\),点的标号为 \((x,y,z)\),其中 \(0\le x,y,z\le 1\)。认为一个给定的 \((i,j,k,l)\) 是从 \((i,j,k)\) 连向 \((j,k,l)\)\(X_{i,j,k,l}\) 条边,则题目描述的长为 \(N+3\) 的序列可以表示为,从某个点开始,经过每条边恰好一次的一条路径。由于不区分重边,所以需要除以 \(\prod_{i,j,k,l} X_{i,j,k,l}!\)

这几乎就是欧拉路径或欧拉回路计数。具体地,如果 \(G\) 是半欧拉图,设出度比入度大 \(1\) 的点是 \(s\),入度比出度大 \(1\) 的点是 \(t\),连一条 \(t\to s\) 的边,转化为欧拉回路计数。

根据 BEST 定理,从一个点 \(s\) 开始的欧拉回路的个数是

\[t_w(G)\times \mathrm{deg}_s!\times \prod_{u\neq s} (\mathrm{deg}_u-1)!. \]

其中 \(t_w(G)\) 是以任意一个点为根的内向生成树个数。

算出这个式子以后,如果 \(G\) 是半欧拉图,那么需要钦定 \(t\to s\) 的边是最后走的,所以需要除以 \(\mathrm{deg}_s\)。如果 \(G\) 是欧拉图,那么从任意一个点开始走都是可以的,所以先选任意一个点当作 \(s\),算出上述式子的值 \(A\) 以后,答案就是 \(\frac{A\times \sum_{i,j,k,l} X_{i,j,k,l}}{\mathrm{deg}_s}\)

1.17

ABC308Ex. Make Q

1.18

ABC310Ex. Negative Cost

ABC306Ex. Balance Scale

ABC305Ex. Shojin

1.19

GDKOI 2024. 染色

不会这种题,比较失败。

首先考虑如何将恰好一个位置 \((x,y)\) 异或 \(1\)。显然先操作一下这个位置,然后这个位置四周的四个位置都会异或 \(1\)。为了消去这四个位置的 \(1\),可以操作这四个位置。不断进行这个过程,发现进行了 \(2^k\) 轮的时候,恰好有四个位置是 \(1\):与 \((x,y)\) 在同一行或同一列,且距离 \((x,y)\) 恰好 \(2^k\) 的位置。称这样的 \(2^k\) 轮操作是一个大小为 \(k\) 的操作。

所以,经过 \(2^n\) 轮后,这四个位置会与 \((x,y)\) 重合,这样就只有 \((x,y)\)\(1\) 了。

如果有多个位置需要异或 \(1\),可以倒着考虑这些操作:一开始这些位置需要大小为 \(n\) 的操作,而每个大小为 \(n\) 的操作都可以用五个大小为 \(n-1\) 的操作完成,最后只剩了一些大小为 \(0\) 的操作,而这就是单点操作。

时间复杂度 \(O(n2^n)\)

(这种题应该手玩一些 \(n\) 比较小的情况,不应该优先考虑找规律。)

GDKOI 2024. 计算

首先,当 \(a,b>0\) 时,\(F(m,a,b)=m^{\gcd(a,b)}\)。所以一定有 \(L\equiv 1\pmod m,R\equiv 0\pmod m\)。所以这段区间是 \(n=\frac{R-L+1}{m}\) 个完整的 \([0,m)\) 区间拼成的。

列出式子:

\[\sum_{0\le x_0,x_1,\dots,x_{m-1}\le n} \left[m\ \middle|\ \sum_{i=0}^{m-1} ix_i\right] \prod_{i=0}^{m-1} \binom{n}{x_i} \]

单位根反演,并做一些化简:

\[\frac{1}{m}\sum_{i=0}^{m-1} \prod_{j=0}^{m-1} (1+\omega_m^{ij})^n \]

\(n\) 次方可以提到乘积外面,考虑这个乘积的式子,由于单位根的几何意义,设 \(d=\gcd(i,m)\),它等于:

\[\prod_{j=0}^{\frac{m}{d}-1} (1+\omega_{\frac{m}{d}}^j)^d \]

由于有如下因式分解:

\[x^k-1=\prod_{i=0}^{k-1} (x-\omega_k^i) \]

代入 \(x=-1,k=\frac{m}{d}\) 即可化简上述式子。然后做莫比乌斯反演即可。

IOI 2024 集训队互测 Round 10. 雷同

将所有书按照重量从小到大排序。考虑建出合并的二叉树,设 \(\mathrm{dep}_i\) 表示第 \(i\) 本书的深度,答案由两部分组成:

  • 每个 \(i\)\(w_i\times \mathrm{dep}_i\)
  • 二叉树上每个非叶子节点 \(u\),设它的两个儿子的子树高度是 \(h_1,h_2\),对答案的贡献是 \(2^{\min(h_1,h_2)}-1\)

注意到 \(\mathrm{dep}_i\) 一定单调不增,所以子树高度一定有 \(h_1\ge h_2\)

按深度从大到小逐层 DP,由于深度大于某个值的一定是一个前缀,所以设 \(f_{i,j}\) 表示当前这一层有前 \(i\) 本书,形成了 \(j\) 个子树的最小代价。加入一本书时:

  • 将这本书放在这一层,作为一个新的子树;
  • 然后进行若干次合并,每次将所有相邻的子树合并成一个新的(\(j\) 个子树会变成 \(\frac{j}{2}\) 个)。这里最优的合并方式一定是按顺序合并,因为这样可以使得新形成的树的高度最小。

这里合并的代价不好计算,但是注意到新加入的一个排名为 \(j\) 的单点,对答案的贡献是固定的一个值 \(v_j\)

时间复杂度 \(O(n^2)\)

1.20

GDKOI 2024. 匹配

首先用网络流求出一组完美匹配。如果它有偶数条黑色边就做完了,否则需要在残量网络上找到一个有奇数条黑色边的简单环。

设状态 \((u,v,c)\) 表示可以找到一个从 \(u\)\(v\) 的路径,其黑色边个数的奇偶性是 \(c\)。为了找到简单环,BFS 到第一个 \(u=v\land c=1\) 的状态就结束即可。

可以做到 \(O(n^{2.5}+\frac{n^3}{w})\)

IOI 2024 集训队互测 Round 17. 区间切割

1.22

ARC170E. BDFS

1.23

ARC141D. Non-divisible Set

1.30

ARC141E. Sliding Edge on Torus

1.31

ARC137E. Bakery

posted @ 2024-03-04 21:24  Alan_Zhao_2007  阅读(24)  评论(0编辑  收藏  举报