杂题选做 25.11

上升序列

有两个长度为 \(n\) 的单调不降序列 \(a,b\),你可以对 \(a\) 进行不超过 \(m\) 次操作:
• 选择一个下标 \(i\) 和一个整数 \(x\),把 \(a_i\) 变成 \(a_i+x\)。这里 𝑥 可以是负数。
操作一次的代价为 \(x^2\)。并且你需要保证每次操作完 \(a_i\) 还是单调不降的。
你要把 \(a\) 变成 \(b\),问最小的代价之和。答案对 \(998244353\) 取模。
如果无解,输出 -1

\(n,m \leq 10^5, a_i,b_i \leq 10^9\),保证 \(a,b\) 单调不降。

每次操作完要求单调不降的限制相当于没有,因为如果 \(a_i\) 当前操作不合法,总可以先操作不合法的那一侧,再操作 \(a_i\)。由于序列单调不降,这样递归下去操作不会成环。

\(f(i,j)\) 表示把 \(i\) 分成 \(j\) 个数 \(x_1,\dots,x_j\)\(\sum x_j^2\) 的最小值。不难发现 \(f(i,j)\) 关于 \(j\) 是下凸的,所以用优先队列维护一个最大的 \(\Delta = f(i,j)-f(i,j+1)\) 就行了。

复杂度 \(O((n+m) \log n)\)

竞赛图

给你一个 \(n\) 个点的竞赛图,求有多少个点集 \(S\) 满足 \(S\) 的诱导子图是强连通的。
其中竞赛图是一个有向图,满足任意两个不同的点之间均存在且仅存在一条有向边相连。

\(T \leq 10\) 组测试数据,\(n \leq 24\)

考虑将每个 scc 缩点后形成的 DAG,由于图是竞赛图,所以拓扑序是唯一的。
那么直接做就是 \(O(T \cdot n2^n)\) 的,无法通过。

考虑到任意两点之间有且仅有一条有向边相连,所以若一个强连通的点集 \(S\) 中的所有点都能走到另一个点 \(k\),则 \(S+k\) 一定不合法。反过来,每个不合法的点集 \(S\) 也一定存在合法的一个子集 \(T\),满足 \(T\)\(S-T\) 间的边都是从 \(T\) 指向 \(S-T\) 的。
\(O(2^n)\) 预处理出每个点集 \(S\) 中每个点出边集合的交 \(R\),若 \(S\) 合法,则 \(\forall T \in R, S|T\) 一定不合法。

据此不难 \(O(2^n)\) 递推计算每个点集的合法性。
复杂度 \(O(T \cdot 2^n)\)

宝宝拼字母

定义两个字符串 \(A,B\) 是相似的当且仅当可以把 \(A\) 中某个长度不超过 \(K\) 的子串(可以为空串)替换为另一个长度不超过 \(K\) 的串得到 \(B\)
给定 \(N\) 个仅包含英文大写字母的串,求出有多少对字符串是相似的。

\(N,K,\sum |S| \leq 5\times 10^5\)

考虑两个字符串 \(A,B\),不妨设 \(|A| \leq |B|\),则它们相似的充要条件是 \(\operatorname{LCP}(A,B)+\operatorname{LCS}(A,B)+K \geq |B|\)

假设我们已经枚举了一个较长的串 \(B\) 的一个后缀 \(R\),那么和 \(B\) 相似的串 \(A\) 必然也有后缀 \(R\),且倒数第 \(|R|+1\) 个字母和 \(B\) 对应不同(防止算重),同时 \(\operatorname{LCP}(A,B) \leq |B|-|R|-K\)。那么我们考虑在两个串的 \(\operatorname{LCP}\) 处统计贡献。首先把所有串正反插入两个 Trie,遍历后缀 Trie 时把当前节点上的串按照大小排序,从小往大遍历即可。问题转化为前缀 Trie 上的单点加和求子树和,不难用 BIT 维护。

复杂度 \(O(\sum |S|\log n)\)

宝宝选数字

给定两个长为 \(n\) 的数组 \(a,b\)。你需要按照任意顺序选择 \(k\) 个下标 \(i_1,\dots,i_k\),使得:

\[\sum_{j=1}^{k} a_{i_j}-\sum_{j=1}^{k-1}|b_{i_j}-b_{i_{j+1}}| \]

最大。特别的,当 \(k=1\) 时后面的求和为 \(0\)

\(n,k \leq 2 \times 10^5, a_i,b_i \leq 10^9\)

首先按照 \(b\) 排序,记 \(f(l,r)\) 表示 \([l,r]\) 中最大的 \(k\)\(a_i\) 之和加上 \(-b_r+b_l\),不难发现 \(f\) 满足四边形不等式。
所以若我们记 \(g_i=\max_{1 \leq j \leq i} f(j,i)\),则 \(g\) 具有决策单调性。

考虑分治解决,则我们需要一个支持快速删除一个数,恢复上一次操作和查询前 \(k\) 大的数据结构,而这链表可以做到:

int val[N],lim,sum; 
struct node{
    int x,y,id;
} a[N]; 
void ins(int x){
	x=a[x].id; L[R[x]]=R[L[x]]=x;
	if(x>lim) sum+=val[x]-val[lim],lim=R[lim];
} 
void del(int x){
	x=a[x].id; R[L[x]]=R[x]; L[R[x]]=L[x];
	if(x>=lim) lim=L[lim],sum+=val[lim]-val[x]; 
} 

复杂度 \(O(n\log n)\)

三分图

定义一张无向图被称为三分图,当且仅当存在至少一种将图中每个顶点染成红、黄、蓝三色之一的方案,使得任意一条边的两个端点颜色不同。
定义一个大小为 \(n\) 的排列 \(p\) 构造的无向图 \(G(p)\)\(\forall 1\leq i<j \leq n\),若 \(p_i>p_j\),则 \(i,j\) 之间有一条边。
给你两个大小为 \(n\) 的排列 \(p,q\),判断有多少个排列 \(k\) 满足:

  1. \(w\) 的字典序 \(\geq p\)\(\leq q\)
  2. \(G(w)\) 是三分图。

多组询问,\(n,T \leq 300\),答案对 \(998244353\) 取模。

发现排列 \(p\) 中若存在 \(a<b<c<d\) 满足 \(p_a>p_b>p_c>p_d\),则 \(G(p)\) 一定不是三分图。
故第二条限制转化为 \(\operatorname{LDS}(p) \leq 3\),由 Dilworth 定理,这等价于可以将排列划分为三个上升子序列。

先考虑怎么判断这个东西,我们可以维护三个上升子序列的末尾元素 \(c_1,c_2,c_3\),插入 \(p_k\) 时,找到最小的 \(c_p\) 满足 \(c_p < k\),然后将 \(c_p\) 修改为 \(k\)。若无法插入 \(p_k\),则不合法。
考虑 dp,设当前三个上升子序列的末尾元素为 \(c_1,c_2,c_3\),则此时 \(<c_1\) 的数一定都已经被插入过了,我们记 \(x_1=(c_1,c_2)\) 中剩多少个数没填 ,\(x2=(c_2,c_3)\) 中剩多少个数没填,\(x3=(c_3,n]\) 中剩多少个数没填,后继状态只依赖于 \(x_1,x_2,x_3\)。令 \(f_{x_1,x_2,x_3}\) 表示这种状态下的合法排列数量,则有转移:

\[\left\{\begin{matrix} x_1>0,f_{x_1,x_2,x_3} \longleftarrow f_{x_1-1,x_2,x_3}\\ x_2>0,f_{x_1,x_2,x_3} \longleftarrow f_{x_1+k-1,x_2-k,x_3},k \leq x_2 \\ x_3>0,f_{x_1,x_2,x_3} \longleftarrow f_{x_1,x_2+k-1,x_3-k},k \leq x_3 \end{matrix}\right.\]

不好优化,改为 dp \(g_{x_1+x_2+x_3,x_2+x_3,x_3}\),则对于 \(g_{a,b,c}\)

\[\left\{\begin{matrix} a-b>0,g_{a,b,c} \longleftarrow g_{a-1,b,c}\\ b-c>0,g_{a,b,c} \longleftarrow g_{a-1,c\sim b-1,c} \\ c>0,g_{a,b,c} \longleftarrow g_{a-1,b-1,0\sim c-1} \end{matrix}\right.\]

可以前缀和优化到 \(O(n^3)\)
而对于字典序的限制,我们可以差分转化为计数字典序 \(\leq p\) 的方案数。套路地枚举所求排列和 \(p\) 的第一个不同位置,同时贪心维护 \(c_1,c_2,c_3\),查表 \(g\) 获取方案数累加即可。

非常厉害,总复杂度 \(O(n^3+Tn^2)\),可以通过。

posted @ 2025-11-21 23:46  Mi2uk1  阅读(11)  评论(0)    收藏  举报