NEUACM 2025 Winter Training 5 题解
D 丝之割
题意
形式化题意:有 m 条弦,一条弦可以抽象为一个二元组 (u,v),你可以进行任意次切割操作,一次切割操作你将选择两个下标 i 和 j 满足 i,j∈[1,n],然后所有满足 u>i,v<j 的弦 (u,v) 都将被破坏,同时你将付出 ai×bj 的代价。求破坏所有弦的最小代价和。
分析
首先观察到若存在两个弦 (x,y),(u,v) 满足 x≤u 且 y≥v。那么我们在删去 (x,y) 的时候就一定会删去 (u,v)。而我们的目标是删除所有的弦,那么就可以忽略 (u,v)。
我们假设现在有了 m 个不相交的弦,那就可以定义状态 fi 表示删除所有小于等于 i 的弦的代价。
fi=j<imin(fj+(k∈[uj,uj+1)minak)×(k>biminak))
我们发现 k∈[uj,uj+1)minak 只与 j 有关,k>biminak 只与 i 有关。不妨用 pj 表示前者,qi 表示后者。
fi=j<imin(fj+pj×qi)
变形后 fj=−qi×pj+fi,把 (pj,fj) 看作点,−qi 看作斜率,就是经典的斜率优化求最小截距。
而且从左向右的过程中 qi 和 fj 单调不下降,直接用最基本的单调队列求下凸壳即可。
F 简单题 加强版
题意
P6222 「P6156 简单题」加强版
求
i=1∑nj=1∑n(i+j)Kgcd(i,j)μ2(gcd(i,j))(mod232)
要求是 O(n) 的复杂度。
分析
先来点喜闻乐见的莫反套路。
====i=1∑nj=1∑n(i+j)Kgcd(i,j)μ2(gcd(i,j))d=1∑ni=1∑⌊dn⌋j=1∑⌊dn⌋(id+jd)Kdμ2(d)[gcd(i,j)=1]d=1∑ndK+1μ2(d)i=1∑⌊dn⌋j=1∑⌊dn⌋(i+j)Kt∣gcd(i,j)∑μ(t)d=1∑ndK+1μ2(d)t=1∑⌊dn⌋μ(t)i=1∑⌊dtn⌋j=1∑⌊dtn⌋(it+jt)Kd=1∑ndK+1μ2(d)t=1∑⌊dn⌋μ(t)tKi=1∑⌊dtn⌋j=1∑⌊dtn⌋(i+j)K
以上都是莫反的常规操作,下面进入本题的核心。
令 T=dt,有
=d=1∑ndK+1μ2(d)t=1∑⌊dn⌋μ(t)tKi=1∑⌊dtn⌋j=1∑⌊dtn⌋(i+j)KT=1∑nTKd∣T∑dμ2(d)μ(dT)i=1∑⌊Tn⌋j=1∑⌊Tn⌋(i+j)K
。
这里还需要用一个技巧就是自然数幂次可以用线筛在 O(n) 时间处理。其实做法也比较显然,因为这是一个完全积性函数,所以只需要用快速幂算质数的幂次,剩下的用完全积性函数的性质算。
i=1∑⌊Tn⌋j=1∑⌊Tn⌋(i+j)K 这部分显然可以预处理出来。
我们用 idiK 表示我们刚才算出来的自然数幂。求前缀和得到 fi。用 Fi 表示 j=1∑ik=1∑i(j+k)K。
我们稍微在纸上写一写,容斥一下有
Fi=Fi−1+2(f2i−1−fi)+id2iK
。
现在剩下 d∣T∑dμ2(d)μ(dT)。
我们发现这实际上就是一个积性函数的迪利克雷卷积,而积性函数的迪利克雷卷积也是积性函数。根据积性函数的性质,我们只需要求出质数的幂次处的值就能用欧拉筛在线性时间算完整个函数。我们令 gi=d∣i∑dμ2(d)μ(di)。下面我们讨论这个函数在质数的幂次处的值。
- 当 k=0 时,g(pk)=g(1)=1。
- 当 k=1 时,g(pk)=g(p)=μ2(1)μ(p)+pμ2(p)μ(1)=−1+p。
- 当 k=2 时,g(pk)=g(p2)=μ2(1)μ(p2)+pμ2(p)μ(p)+p2μ2(p2)μ(1)=−p。
- 当 k>2 时,无论怎么选 d,μ2(d) 和 μ(di) 中至少有一个有高次幂,所以 g(pk)=0。
现在,原式就变成了
T=1∑nidK(T)g(T)F(⌊Tn⌋)
就可以用经典的数论分块求解了!
H String Problem
题意
给定一个字符串,求出每个前缀当中字典序最大的子串。
分析
稍加分析我们就可以得出一个比较显然的结论,一个字符串当中字典序最大的子串一定是它的一个后缀。现在我们只需要求每个前缀当中字典序最大的后缀。
如果要进一步解决问题就需要进一步观察,这里我列一个我认为对我启发比较大的观察。
如果我们已经求出当前前缀中字典序最大的后缀,现在尾部再加入一个字符,新的答案要么不变,要么就是新加入的字母,要么是 原答案的最小 border 加上这个字符。这里 border 指的是当前答案的与其相同前缀的后缀。
我们知道 border 与循环节有着密不可分的关系。如果我们知道一个字符串的循环节,就能直接找到它的最小 border。
我们假设已经求出了长度为 i 的前缀的答案为 p 开始的后缀,且它的循环节长度为 k,考虑新加入字符 si+1 对答案的影响。
若 si+1>sp,那么新答案就是 i+1,因为其他字符一定都小于 si+1。
若 si+1>sp+((i+1−p)modk),也就是新字符比循环节中对应的字符大,那么新答案就是 i+1−((i+1−p)modk)。稍微写一写就能看出,就不证明了。
若 si+1<sp+((i+1−p)modk),也就是新字符比循环节中对应的字符小,那么答案不变,但是要重新求循环节。
若 si+1<sp+((i+1−p)modk),也就是新字符就是循环节中对应的字符,那么答案不变,循环节也不变。
至于怎么求循环节,我采用了 Z 函数的方法。循环节的长度就是第一个相同前缀是自己本身的后缀与整个字符串的差。我们找到第一个就不用再求了,因为我们只需要求循环节。然后整个更新过程中求 Z 函数都是不断往右的,复杂度也是线性的。
L Pastoral Oddities
题意
给定一张 n 个点的无向图,初始没有边。
依次加入 m 条带权的边,每次加入后询问是否存在一个边集,满足每个点的度数均为奇数。
若存在,则还需要最小化边集中的最大边权。
分析
本题最重要的观察就是原命题等价于存在一个边集使得只存在大小为偶数的连通块。
必要性:若存在大小为奇数的连通块,每个点度数又是奇数,那边数就是 2∑degi,无法除尽,矛盾。
充分性:对于任意的大小为偶数的连通块,取一个它的生成树,对于每个非根节点,若它儿子给它的度数为偶,则连父亲,否则不连父亲。这样可以保证除根以外都满足度数为奇数。再用刚才的方法,边数等于 2∑i=rootdegi+degroot。分子中前一项为奇数,后一项一定也是奇数。
在有了这个结论后,原问题就转化为要最小化边集中的最大边权使得子图中连通块大小都为偶数。如果是静态的问题,可以按边权排序,用并查集维护每个连通块大小,不断加边知道满足条件。
动态的情况下,一般与连通块并查集相关的问题都可以尝试用线段树分治解决。
我们给边排序,考虑在全部边都可用的情况下算出答案就是最后一次加入边的答案。我们考虑倒序删边,已加入的边在被删掉前一定都在答案中。
我们考虑线段树分治,先递归右子树,再递归左子树,到叶子节点时,不断加边知道满足条件,期间加入的边在由于时间而删掉前会一直存在,所以可以边加入,边修改线段树,将这条边一定在答案中的区间中都加上这条边。