2024.2 我在歌坛献首歌 宫殿 塔尖 彩绘 日月 同辉 那层厚重壁垒化身 蝉翼一片
\(\text{P6396}\).
好题。
因为和回文串有关,所以我们考虑把他扔到 PAM 里面。考虑在回文自动机的节点间建单向边,然后跑单源最短路。
-
光归:连边 \((i,fail_i,A)\),其中 \(fail_i\) 可以为 \(0\)。
-
光辉:连边 \((fail_i,i,B)\),其中 \(fail_i\) 可以为 \(0\)。
-
光隐:处理出来 \(i\) 的 \(fa_i\),然后连 \(k\) 条 \((i,fa_i,C)\) 的边。
-
光腾:
这个操作就不能直接连边了,因为我们发现这个操作其实是这个操作,本质上是从 \(i\) 以 \(D\) 的代价转移到 \(i\) 子树中的任意一个结点。这样不行,数量是 \(\mathrm O(|S|^2)\) 级别的。
考虑优化建图的思想,对每个点建立一个对应的虚点,而虚点只能往儿子的方向转移(花费为 \(0\))。那么我们只需要对于 \(i\) 连一条向 \(i\) 的虚点边权为 \(D\) 的边,然后 \(i\) 的虚点向 \(i\) 连一条边权为 \(0\) 的边即可。
- 光弋:这个操作做完了之后就不能做前面的 \(4\) 个操作了。所以这个操作我们考虑放到询问的时候再来做。
建完图之后我们跑一边 Dijkstra,然后定义 \(dis_i\) 表示到第 \(i\) 个点的最短路。
考虑询问。由于光戈操作只能由回文串在前面添加字符而来,故开始光戈前一定是询问串的一个回文后缀。
首先暴力跳 \(fail\) 是简单的,此时考虑如何优化。
我们发现跳 \(fail\) 时长度是在不断减小的,也就是查询的实际上是从根出发的一条链的最小值。
然后此时我们可以用倍增求出来第一个 \(len_p \le r - l + 1\)。然后我们就知道答案就是 \((r - l + 1) \times E + dis_p - len_p \times E\)。那么我们查询的复杂度就是 \(O(q \log n)\)。
那么时间复杂度就是 \(\mathrm O(k \times |S| + (k \times |S| + q) \log n)\)。
\(\text{P4094}\).
首先这个答案有单调性,所以我们可以二分。
二分答案的最大值,假设当前答案为 \(len\),会有如下的性质:
- 我们可以找到一个子串 \(ans\) 完全位于 \([a,b]\) 之间,那么这个子串的启示点再 \([a,b - len + 1]\) 之间。
- \(\text{LCP}(ans,a[c:n]) \ge len\)。
由 \(height\) 数组的性质,我们可以发现满足第二个性质的 \(ans\) 开头一定是一段包含 \(c\) 的连续区间。然后这一步我们依然可以用一个二分来判断两个端点,然后用第一个条件来检测时候合理。
然后这一步我们可以使用主席树来维护,即维护答案的区间内有没有 \(i\) 满足 \(sa_i \in [a,b - len + 1]\)。
\(\text{CF853E}\).
首先我们发现若 \(vx_i < 0\) 且 \(vy_i < 0\) 时,我们把 \(vx_i \to -vx_i,vy_i \to -vy_i\) 是没有变化的。
此时我们令 \(\mathrm p = \mathrm p - t\sum \mathrm v_j\)。然后我们一个项可得 \(\mathrm k = \mathrm p + \sum w_j \mathrm v_j\),然后 \(w_i\) 的取值范围就变为了 \([0,2 \times t]\)。
那么所有合法的 \(\mathrm k\) 就会在以 \(\mathrm p\) 开始按斜率从小到大的顺序依次把向量接起来得到一个下凸壳,和以 \(\mathrm p\) 开始按斜率从大到小顺序接出一个上凸壳之间,那么现在问题就变成了在这个多边形内二维数点了。
对于这种多边形数点,我们可以考虑把整个凸包拆成一些梯形。由于斜率的种数是 \(O(k)\) 级别的,所以我们可以枚举斜率然后再做二维数点。
那么复杂度为 \(O((n + k) \log k)\)。
\(\text{CF850E}\).
假设 \(A\) 胜利,则最终答案就是 \(A\) 胜利的数量再 \(\times 3\)。
设第 \(i\) 个人对于 \(A\) 和 \(B\) 之间的投票为 \(P_i\),对于 \(A\) 和 \(C\) 之间的投票为 \(Q_i\),则我们有:
-
\(P_i = 0,Q_i = 0\),那么顺序有 \(C \to B \to A\) 或 \(B \to C \to A\)。
-
\(P_i = 0,Q_i = 1\),那么顺序为 \(C \to A \to B\)。
-
\(P_i = 1,Q_i = 0\),那么顺序为 \(B \to A \to C\)。
-
\(P_i = 1,Q_i = 1\),那么顺序有 \(A \to B \to C\) 或 \(A \to C \to B\)。
此时我们发现当 \(P_i = Q_i\) 时贡献为 \(2\)。此时设 \(S = S1 \oplus S2\),那么这一对的贡献就是 \(2^{n-\text{popcount}(S)}\)。
我们对每个 \(S\) 计算出有多少对 \(S = S1 \oplus S2\) 且 \(f_{S1} = f_{S2} = 1\),我们发现答案就是 \(f\) 与自己的异或卷积,即 \(\sum^{2^n-1}_{i = 1} (\sum^{j \oplus k = i} f_j f_k) \times 2^{n - \text{popcount(i)}}\)。
那么直接上 FWT 即可。
\(\text{P5161}\).
先令 \(d_i = a_{i + 1} - a_i\),那么条件就转化为不相邻不相交且相等子串的对数。这个东西不好求,考虑对其进行补集转化,转化为相邻或相交且相等的字串对数。
考虑对 \(d\) 求出其后缀数组。根据品酒大会的思路,我们考虑将 \(hight\) 从大到小和并相邻的两个排名的后缀。考虑怎么计算两个集合 \(X,Y\) 之间的贡献。
我们发现就是 \(\sum_{x \in X} \sum_{y \in Y} \max(0,w + 1 - |x - y|)\),其中 \(w\) 是现在枚举到的 \(height\)。然后对于每一个 \(y\),我们考虑什么时候 \(w + 1 - |x - y| > 0\),即 \(w + 1 \ge |x - y|\),然后我们把这个绝对值拆开,得 \(x \in [y - w,y) \cup (y,y + w]\)。就只需要计算有多少个 \(x \in [y - w,y) \cup (y,y + w]\)。这个东西考虑用一颗权值线段树维护。然后和并两个集合 \(X,Y\) 就直接用线段树合并就行了。
\(\text{AT_arc191_c}\).
太脑电波了,记录一下。
我们钦定 \(A = n+1,M = n^2\)。然后我们发现 \(n\) 就是这个方程的最小解。
证明:你把 \(A^x\) 用二项式定理拆开,然后你会发现 \(A^x = nx + 1 \pmod m\),此时 \(x = n\) 是本方程的最小解。
\(\text{P6665}\).
神仙!
由于每一棵树都互相独立,并且操作完一棵树之后这整一棵树都会被删除,所以我们可以考虑把我们的 SG 值设在根节点。那么我们设 \(f_i\) 为以 \(i\) 为根的子树的 SG 值,此时我们考虑删去节点对于答案的影响。
-
删掉根节点 \(u\):加入 \(\oplus_{v \in son_u} f_v\)。
-
删掉非根节点 \(v\):那么会剩下 \(v\) 到 \(u\) 路径上每个点的所有子树去掉 \(u,v\) 路径上除了 \(v\) 结点以外的点的子树。此时考虑记 \(g_u =\oplus_{v \in son_u} f_v\),则会加入 \(g_u \oplus_{w \in (u,v) \& w \neq u} (g_{fa_w} \oplus f_w)\) 的贡献。
得到这个之后我们就有了 \(\mathrm O(n^2)\) 的做法。
考虑用数据结构来优化这几种转移操作。现在要找到一个数据结构可以支持全局异或,快速合并和查询全局 mex。此时我们考虑用 01trie 来维护。其中的全局 mex 可以用二分来解决。
具体的每个结点维护一棵 01trie,这个 01trie 维护 \(g_{fa_v} \oplus f_v\)。在每一次操作中,这一个 01trie 异或上 \(g_v \oplus f_v\),然后合并到 \(u\) 的 01tire 上,此时再把 \(\oplus_{v \in son_u} f_v\) 插入 \(u\) 的 01trie,最后查询时求出此时的 mex 即可。
\(\text{AT_agc027_d}\).
速通。

\(\text{P10890}\).
出题人太强了吧!
前置知识:\(k\) 进制下的 \(\text{FWT}\),单位根反演。
我们发现就是要求 \(\sum^n_{i = 1} \prod^m_{j=1} [3 \mid \sum^k_{l = 1}a_{i,j,l} \times d_l]\)。
然后我们对于这个式子进行单位根反演(\([k\mid n]=\frac{1}{k} \sum^{k-1}_{i=0}\omega^{in}_k\)),可得:
此时我们令一个数组 \(b\),其长度为 \(m\),\(b\) 中的每一个数均在 \([0,2]\) 之间。此时考虑将这个式子展开,可得答案就是 \(\frac{1}{3^m} \sum^n_{i=1}\sum_b \omega_3^{\sum^k_{i=1}d_x\sum^m_{j=1}a_{i,j,x}b_j}\)。
此时我们已经可以得到 \(\mathrm O(n3^mk)\) 的查询了。考虑继续优化。
然后我们定义 \(c_i = \sum^m_{j=1} a_{i,j,x}b_j\)。同时我们将 \(c_i\) 带入进式子里面,同时记 \(cnt_c\) 为 \(c\) 出现的次数,那么这个序列的答案就变为 \(\frac{1}{3^m} \sum_c cnt_c \prod^k_{i=1}\omega_3^{c_i d_i}\)。
为了做到 \(O(k)\) 的复杂度查询,考虑预处理 \(d = 1\to 3^k\) 之内的所有答案。此时我们考虑用 \(\text{3 -FWT}\)。
对于 \(\text{3-FWT}\),我们列出来此时的位矩阵:
由于 \(\omega_3\) 在模 \(10^9+7\) 意义下有逆元,所以我们不需要用分圆多项式,模数直接选择 \(10^9+7\) 即可。
然后我们就可以在 \(\mathrm O(n3^mmk + k3^k + qk)\) 的时间内完成。

浙公网安备 33010602011771号