做题记录 26.3.25

\(\textcolor{purple}\odot\) AT_agc039_d [AGC039D] Incenters

对于单位圆上三点 \(A,B,C\),令 \(D,E,F\) 分别为 \(\overset{\frown}{BC},\overset{\frown}{AC},\overset{\frown}{AB}\) 的中点,可证 \(\triangle ABC\) 的内心等于 \(\triangle DEF\) 的垂心

根据欧拉线,垂心为外心到重心的连边的两倍延长处,此题中重心为 \(O\),因此垂心的期望为重心期望的三倍

而重心坐标为三个顶点坐标的平均

\(p_i\) 表示第 \(i\) 个点,\(M(a,b)\) 表示弧的中点,则答案为

\[\begin{aligned} &3\times \frac 1{\binom{n}3} \sum_{1\le a<b<c\le n} \frac{M(p_a,p_b)+M(p_b,p_c)+M(p_c,p_a)}{3} \\ =&\frac 1{\binom{n}3} \sum_{1\le a<b<c\le n} {M(p_a,p_b)+M(p_b,p_c)+M(p_c,p_a)} \\ =&\frac 1{\binom{n}3} \sum_{1\le a<b<c\le n} {M(p_a,p_b)+M(p_b,p_c)-M(p_a,p_c)} \\ =&\frac 1{\binom{n}3} \sum_{1\le a<b\le n} M(p_a,p_b)((n-b)+(a-1)-(b-a-1)) \\ \end{aligned} \]

容易做到 \(O(n^2)\)

代码

参考

\(\textcolor{purple}\odot\) AT_agc044_c [AGC044C] Strange Dance

将加一、异或的 \(\text{Trie}\) 扩展到三进制即可

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

代码

\(\textcolor{black}\odot\) CF1801G A task for substrings

预处理 \(f_i\) 表示 \(t[1:i]\)\(s\) 的数量,令 \(g_i\) 表示为 \(t[1:i]\) 的后缀的 \(s\) 中最长的一个的 \(id\),两者容易通过 \(\text{ACAM}\) 求出

对于一组询问 \([l,r]\),令 \(q\) 为满足 \(q\le r,q-|s_{g_q}|<l\) 的最大值,容易线段树上二分求出

\(q<l\) 则表示不存在匹配 \(t[[1\sim l-1]:[l\sim r]]\)\(s\),从而此时的答案为 \(f_r-f_{l-1}\)

否则 \(t[l:r]\) 所包含的 \(s\) 可以分为两类,一类为右端点在 \((q,r]\) 中的,显然数量为 \(f_r-f_q\),一类为右端点在 \([l,q]\) 中的,显然等价于查询 \(s_{g_q}\) 的一个后缀中 \(s\) 的数量

对于每个 \(s\) 的每个后缀预处理其包含的 \(s\) 的数量,容易通过对所有 \(s\) 的逆序串建 \(\text{ACAM}\) 求出

时间复杂度 \(O(\sum |s||\sum|+|t|+m\log|t|)\)

代码

参考

\(\textcolor{purple}\odot\) CF1313E Concatenation with intersection

显然一组 \([l_1,r_1]\)\([l_2,r_2]\) 有交且长度之和为 \(m\) 时需要满足 \(l_1\le r_2\le l_1+m-2\)

\(za_i\) 表示 \(a[i:]\)\(s[1:n-1]\)\(\text{lcp}\)\(zb_i\) 表示 \(b[:i]\)\(s[2:n]\)\(\text{lcs}\),两者容易用 \(\text{exkmp}\) 求出

则答案为

\[\sum_{l_1}\sum_{l_1\le r_2\le l_1+m-2} \max(0,za_{l_1}+zb_{l_2}-m+1) \]

容易优化到 \(O(n\log n)\)

代码

参考

\(\textcolor{purple}\odot\) CF914F Substrings in a String

使用 bitset

对于每种字符保存一个 bitset 表示其位置的掩码,每次询问 \([l,r,y]\),枚举 \(i=1\sim |y|\),按位与上字符 \(y_i\)bitset 右移 \(i\),最终得到的 bitset 取一个范围内的 count 即为答案

时间复杂度 \(O(\frac{|\sum|n}{\omega}+q|\sum|+\frac n{\omega} \sum|y_i|)\)

代码

参考

\(\textcolor{black}\odot\) CF906E Reverses

将两个串交错排列得到一个长度为 \(2n\) 的串,转化为将这个串划分为若干偶回文子串,最小化长度 \(>2\) 的回文子串数量

直接 \(dp\) 容易做到 \(O(n^2)\),考虑优化

若一个字符串 \(\text{A}\) 为回文串,

建立 \(\text{PAM}\),每个结点记录 \(df\) 表示当前结点和其 \(\text{fail}\) 结点代表字符串长度的差值,\(sl\) 表示 \(\text{fail}\) 树祖先中第一个和当前点的 \(df\) 不同的点

显然每次跳 \(sl\),任意一个点只会跳至多 \(O(\log n)\)

每次跳过一段 \(df\) 相同的祖先,若数量为 \(1\) 则考虑之,可证若数量 \(>1\) 则只需要考虑一段中第一个和最后一个

时间复杂度 \(O(n\log n+n|\sum|)\)

代码

参考

posted @ 2026-03-26 06:35  Hstry  阅读(1)  评论(0)    收藏  举报