近一个月来第一次赛时通过一道题。真是可喜可贺。
A – 单调
一开始以为与网络流相关;后来考虑 DP;结果是个贪心或者乱搞。
题意简述
给定长为 n (n≤105) 的序列 ⟨ai⟩,ai∈{1,2,3}。匹配尽可能多的子序列,每个子序列均为 ⟨1,2,3⟩ 或 ⟨3,2,1⟩,且一个位置最多被一个子序列占用。求最大匹配数。
解一
经过了奇妙转化后的贪心。
可以发现,任意位置匹配出两个不交的子序列 ⟨3,2,3⟩ 和 ⟨1,2,1⟩,总是能够合并成为两个合法的子序列并计入答案;同时 ⟨1,2,1⟩ 可以合并任意位置的 3 产生一合法子序列,⟨3,2,3⟩ 之于 1 亦然。可以分类讨论简单证明。
我们把 3 视作 1,并令合法序列为 ⟨1,2,1⟩,匹配尽可能多的子序列。设实际上我们匹配了 a 个 ⟨1,2,3⟩,b 个 ⟨3,2,1⟩,c 个 ⟨1,2,1⟩,d 个 ⟨3,2,3⟩。我们最大化了 s=a+b+c+d,实际上我们需要最大化
a+b+2×min{c,d}+{min{∣实际未被匹配的 3∣,c−d},min{∣实际未被匹配的 1∣,d−c}(c≥d)(d>c)
考虑条件语句内的取值情况。以 c≥d 时为例。若取 c−d 为 min,说明我们将 ⟨1/3,2,1/3⟩ 形式的子序列匹配数量最大化,这是将 ⟨1,2,3⟩,⟨3,2,1⟩ 匹配数量最大化的充分条件;若取“实际未被匹配的 3 的数量”为 min,则说明我们已经使用完了本序列中所有 3 元素,而一个合法子序列至少需一个 3,故亦达到上限。故我们取 min{cnt(3),cnt(1),1},就是最终答案。
我们二分转化后匹配了多少个 ⟨1,2,1⟩。若匹配了 s 个,则选取序列首 s 个 “1” 和末 s 个 “1” 分别作为子序列的头和尾,易得此时 2 的选取具有完全的决策包容性。最后构造方案时按照上文方法合并、转化即可。时间复杂度 O(nlogn)。
解二
反悔贪心,正确性难以证明且不易在赛场上正确实现,故此处略去。
B – 期望
题意简述
下文约定质数常数 p=109+7,Z/pZ 即整数模 p 域。
给定一棵以 1 为根的大小为 n 的树。有一未知的权值序列 ⟨a1,a2,⋯,an⟩,ai∈Z/pZ。现给定整数常数 k,0≤k<p,2∤k。我们生成一长为 k 序列 ⟨bi⟩,满足 bi 在 1,⋯,n 中等概率随机选取。定义一长为 n 的序列 ⟨cx⟩,满足
cx={∏i=1kabk,0(x=lca(b1,⋯,bk))(otherwise)
现在,给定 ⟨E(cx)⟩,即 cx 的期望构成的序列。请求出在整数域意义下 a1 的最小值,或报告无解。
题解
离考试结束还有半小时的时候瞟了一眼。
不难得到,cx 是 k 个权相乘的形式,当且仅当选择的这 k 个节点全部在 x 的子树中(含 x),且没有聚集在同一个儿子的子树内。那么,对于节点 x,所有情况下 cx 之和具有了组合意义:我们任意选取 k 个可重的节点,将其权值之积累加,其等于 (av1+av2+⋯+avt)k=Sxk,其中 v 取遍 x 子树中所有节点,Sx 为 x 子树内所有节点的权值之和;再减去不合法方案权值总和——枚举 x 的儿子 y,同理可得应减去 Syk。再将“期望”序列转化成所有情况的权值和,得到
E(cx)nk=Sxk−y is a son of x’s∑Syk
于是我们可以由上述递推关系求出所有节点 x 的 Sxk。
然后我傻眼了。我记得当 k>1 时,在 Z/pZ 上 ak≡b 是多解……于是似乎并不能递归求出 ax(先求出叶子结点;再向父亲的 Sfa 合并)。遗憾地打了 10 pts 暴力跑路。
引理 1 – k 次剩余
若有变量 a 及常数 b,a,b∈(Z/pZ)×,则 ak≡b 或者无解,或者有 gcd(k,φ(p))=gcd(k,p−1) 个不同根。
证明
记 (Z/pZ)× 的生成元为 g。将上式转写为 (gc)k≡gf,于是要求 ck≡f(modp−1)。若 gcd(k,p−1)∣f,则由线性同余方程相关知识得到共有 gcd(k,p−1) 个解;否则该方程无解。□
对 p−1 分解质因数,发现它等于 2⋅(5×108+3)。又由于 2∤k,于是当 k=5×108+3 时,必然有 gcd(k,p−1)=1,由上文结论可知此时任意元素 a,a∈Z/pZ 均有唯一的 k 次方根!
当 k=5×108+3
我们不必每次都用大步小步算法计算 k 次方根:由于其唯一,故我们直接对两边取 k1 次方,得到 ax≡bk1modp−1(注意指数在 Z/(p−1)Z 上)。之后从叶子向根依次合并即可。使用快速幂和扩展欧几里得算法,时间复杂度 O(nlogp)。
当 k=5×108+3
我们改写 S1 的递归定义式子,得到 a1=S1−∑y is a son of x’sSy。
若有 k=2p−1,则由上文可得,当且仅当 b≡±1(1≡gp−1,−1≡g2p−1)(由欧几里得引理可以得到,m 为奇素数时 Z/mZ 上 a2≡1 有且仅有 a≡±1 两个解,于是必然有 (−1)2≡1⟺−1≡g2m−1)时,ak≡b 才有解;特别地,若 b≡0,则 a≡0。
当 b≡1≡gp−1 时,引理 1 中的线性同余方程可以写作 c2p−1≡0(modp−1)。于是 c 可以取任意偶数,使得 a≡gc,ak≡b;同理,b≡−1 时,可取任意奇数 c 使得 (a=gc)k≡b。
现在回到 a1=S1−∑y is a son of x’sSy 上来。我们剔除所有 Svk=0 的项,检查是否存在 Svk=±1。若是,则该组数据无解。否则我们试图在整数域上最小化 a1。
以下所有证明,感谢李枨夏(L7-56)点拨思路。
引理 2
对于 a,a∈(Z/pZ)×,若 a≡gc,且 −a≡gd,a−1≡ge,则 c≡e(mod2),c≡d(mod2)。
容易由 −1≡g2p−1,1≡gp−1 且 2p−1=5×108+3≡1(mod2) 得证。
引理 3
对于任意常数 z∈(Z/pZ)×(注意 z 非 0)、u,v∈{0,1},以及变量 c,d,且满足 c≡u(mod2),d≡v(mod2),总能找到合适的 c,d,满足 gc+gd≡z。
证明
设 α 为任意不为 1 的 (Z/pZ)× 内元素。令 z≡ge,我们试图构造 gc≡αge≡ge+t,gd≡(1−α)ge≡ge+r。
如果 c,d 均与 e 奇偶性相异,则需要满足 α≡gt,−α≡gr,−α+1≡gs,其中 t≡s≡1(mod2),由引理 2 得到 2∣r。于是我们要求 −α 和 −α+1 由原根次幂表示时,指数奇偶性依次为偶、奇;又由于 g 的偶次幂、奇次幂分别生成 2p−1 个 (Z/pZ)× 中元素,且 1=gp−1,2∣p−1,则由抽屉原理得到一定存在该 α。
同理,如果 c,d 中有一个与 e 奇偶性相异,则要求存在次幂为“偶/偶”或“奇/奇”的邻项 −α,−α+1;若 c,d 均与 e 奇偶性相同,则要求存在“奇/偶”式的邻项。在 p=109+7 的条件下,这两种分界都是存在的(1,2,3,4 均是 g 的偶次幂,故“偶/偶”分界存在;而有最小原根 g=5,所以再次应用抽屉原理得到“奇/偶”分界存在);故而我们总是可以构造出合法的方案,使得原式成立。□
那么,假设存在 l,l≥3 个及以上的非零 Svk(对于 v=1,我们根据引理 2 反转其符号,得到 (−Sv)k=−Svk),我们取其中 l−2 个求出其任意根求和(并使和不为 0。由于每个 Sv 的根的多样性,这是一定存在的),然后将剩余 2 个 Svk 按照引理 3 构造一组解,使得其和为前述和的相反数即可;
当 l=2,1,0 时,我们根据 Svk 的符号分类讨论,求出最优解即可。时间复杂度 O(n+logp)。
C – 背包
题意简述
给定 n 件物品,体积分别为 v1,v2,⋯,vn;现要恰好装满一容量为 m 的背包(n,m≤5000)。求在使用物品数 c 最少的方案中,以下各项数据的最小值:
- c 件物品体积平均值;
- 按体积从小到大排序,第 ⌊2c+1⌋ 件物品的体积(中位数);
- c 件物品体积的极差;
- 记该 c 件物品的体积的众数为 t,t 出现的次数。
题解
第一问答案为 cm。
考虑将 n 件物品排序后依次转移。我们设 f(i,x) 为一个二元组 (d,s),表示考虑了前 i 件物品的取舍,体积和为 x 的所有方案中,满足 d 最小的情况下,首个放入背包的物品的大小 s 为何。转移时以 d 为第一关键字,s 为第二关键字。每当我们成功从 f(i,m−vi+1)=(d,s) 转移到 f(i+1,m)=(d+1,s) 时,若全局答案 c 产生更新,则直接采用 vi+1−s 作为新的最小极差;否则若 d+1=c,尝试更新极差为 vi+1−s。第三问解完。
若第二问的答案为 vi,则一定存在至少一个最优解的转移路径,经过了 f(i−1,x−vi)→f(i,x)(x 取任意体积),同时有 f(i,x)=(2c+1,?)。则我们以 O(nm) 的空间记录转移路径,由所有最优解作为起点逆推回去即可。第二问解完。
至此我们以 O(nm) 的时间和空间解完前三问。我们发现“存在一条最优解转移路径,对于不同的体积大小,均使用不超过 t 个物品”关于 t 有0/1单调性。于是二分 t,使用多重背包结合单调队列快速进行带线性限制的转移。时间复杂度 O(nmlogn),但由于内存访问连续性、局部性强(可以 O(m) 逐层存储状态),实际表现非常优秀。