MOCK quasi-PTS 20230209 日志

近一个月来第一次赛时通过一道题。真是可喜可贺。

A – 单调

一开始以为与网络流相关;后来考虑 DP;结果是个贪心或者乱搞。

题意简述

给定长为 n  (n105)\newcommand\bigO{\operatorname{O}}n\ \ (n\leq 10^5) 的序列 ai,ai{1,2,3}\langle a_i\rangle,a_i\in\{1,2,3\}。匹配尽可能多的子序列,每个子序列均为 1,2,3\langle 1,2,3\rangle3,2,1\langle 3,2,1\rangle,且一个位置最多被一个子序列占用。求最大匹配数。

解一

经过了奇妙转化后的贪心

可以发现,任意位置匹配出两个不交的子序列 3,2,3\langle 3,2,3\rangle1,2,1\langle 1,2,1\rangle,总是能够合并成为两个合法的子序列并计入答案;同时 1,2,1\langle 1,2,1\rangle 可以合并任意位置的 33 产生一合法子序列,3,2,3\langle 3,2,3\rangle 之于 11 亦然。可以分类讨论简单证明。

我们把 33 视作 11,并令合法序列为 1,2,1\langle 1,2,1\rangle,匹配尽可能多的子序列。设实际上我们匹配了 aa1,2,3\langle 1,2,3\ranglebb3,2,1\langle 3,2,1\ranglecc1,2,1\langle 1,2,1\rangledd3,2,3\langle 3,2,3\rangle。我们最大化了 s=a+b+c+ds=a+b+c+d,实际上我们需要最大化 a+b+2×min{c,d}+{min{实际未被匹配的 3,cd},(cd)min{实际未被匹配的 1,dc}(d>c) a+b+2\times \min\{c,d\}+\begin{cases} \min\{|\text{实际未被匹配的 3}|,c-d\},&(c\geq d)\\ \min\{|\text{实际未被匹配的 1}|,d-c\}&(d>c) \end{cases}

考虑条件语句内的取值情况。以 cdc\geq d 时为例。若取 cdc-dmin\min,说明我们将 1/3,2,1/3\langle 1/3,2,1/3\rangle 形式的子序列匹配数量最大化,这是将 1,2,3,3,2,1\langle 1,2,3\rangle,\langle 3,2,1\rangle 匹配数量最大化的充分条件;若取“实际未被匹配的 33 的数量”为 min\min,则说明我们已经使用完了本序列中所有 33 元素,而一个合法子序列至少需一个 33,故亦达到上限。故我们取 min{cnt(3),cnt(1),1}\min\{\text{cnt}(3),\text{cnt}(1),1\},就是最终答案。

我们二分转化后匹配了多少个 1,2,1\langle 1,2,1\rangle。若匹配了 ss 个,则选取序列首 ss1“1” 和末 ss1“1” 分别作为子序列的头和尾,易得此时 22 的选取具有完全的决策包容性。最后构造方案时按照上文方法合并、转化即可。时间复杂度 O(nlogn)\bigO(n\log n)

解二

反悔贪心,正确性难以证明且不易在赛场上正确实现,故此处略去。

B – 期望

题意简述

下文约定质数常数 p=109+7p=10^9+7Z/pZ\newcommand\ZmpZ{\mathbb{Z}/p\mathbb{Z}}\ZmpZ 即整数模 pp

给定一棵以 11 为根的大小为 nn 的树。有一未知的权值序列 a1,a2,,an,aiZ/pZ\langle a_1, a_2,\cdots,a_n\rangle,{\color{red}a_i\in \ZmpZ}。现给定整数常数 k,0k<p,2kk,0\leq k<p,{\color{red}2\nmid k}。我们生成一长为 kk 序列 bi\langle b_i\rangle,满足 bib_i1,,n1,\cdots,n 中等概率随机选取。定义一长为 nn 的序列 cx\langle c_x\rangle,满足 cx={i=1kabk,(x=lca(b1,,bk))0(otherwise) c_x=\begin{cases} \prod_{i=1}^k a_{b_k},&(x=\operatorname{lca}(b_1,\cdots,b_k))\\ 0&(\text{otherwise}) \end{cases}

现在,给定 E(cx)\langle E(c_x)\rangle,即 cxc_x 的期望构成的序列。请求出在整数域意义下 a1a_1 的最小值,或报告无解。

题解

离考试结束还有半小时的时候瞟了一眼。

不难得到,cxc_xkk 个权相乘的形式,当且仅当选择的这 kk 个节点全部在 xx 的子树中(含 xx),且没有聚集在同一个儿子的子树内。那么,对于节点 xx,所有情况下 cxc_x 之和具有了组合意义:我们任意选取 kk 个可重的节点,将其权值之积累加,其等于 (av1+av2++avt)k=Sxk(a_{v_1}+a_{v_2}+\cdots+a_{v_t})^k=S_x^k,其中 vv 取遍 xx 子树中所有节点,SxS_xxx 子树内所有节点的权值之和;再减去不合法方案权值总和——枚举 xx 的儿子 yy,同理可得应减去 SykS_y^k。再将“期望”序列转化成所有情况的权值和,得到 E(cx)nk=Sxky is a son of x’sSyk E(c_x)n^k=S_x^k-\sum_{y\text{ is a son of } x\text{’s}}S_y^k

于是我们可以由上述递推关系求出所有节点 xxSxkS_x^k

然后我傻眼了。我记得当 k>1k>1 时,在 Z/pZ\ZmpZakba^k\equiv b 是多解……于是似乎并不能递归求出 axa_x(先求出叶子结点;再向父亲的 SfaS_{\text{fa}} 合并)。遗憾地打了 10 pts\text{10 pts} 暴力跑路。

引理 1 – kk 次剩余

若有变量 aa 及常数 bba,b(Z/pZ)×a,b\in(\ZmpZ)^{\color{red}\times},则 akba^k\equiv b 或者无解,或者有 gcd(k,φ(p))=gcd(k,p1)\gcd(k,\varphi(p))=\gcd(k,p-1) 个不同根。

证明

(Z/pZ)×(\ZmpZ)^{\times} 的生成元为 gg。将上式转写为 (gc)kgf(g^c)^k\equiv g^f,于是要求 ckf(modp1)ck\equiv f\pmod{p-1}。若 gcd(k,p1)f\gcd(k,p-1)\mid f,则由线性同余方程相关知识得到共有 gcd(k,p1)\gcd(k,p-1) 个解;否则该方程无解。\square

p1p-1 分解质因数,发现它等于 2(5×108+3)2\cdot (5\times 10^8+3)。又由于 2k2\nmid k,于是当 k5×108+3k\neq 5\times 10^8+3 时,必然有 gcd(k,p1)=1\gcd(k,p-1)=1,由上文结论可知此时任意元素 a,aZ/pZa,a\in\ZmpZ 均有唯一的 kk 次方根!

k5×108+3k\neq 5\times 10^8+3

我们不必每次都用大步小步算法计算 kk 次方根:由于其唯一,故我们直接对两边取 1k\frac{1}{k} 次方,得到 axb1kmodp1a_x\equiv b^{\frac{1}{k}\bmod{p-1}}(注意指数在 Z/(p1)Z\mathbb{Z}/(p-1)\mathbb{Z} 上)。之后从叶子向根依次合并即可。使用快速幂扩展欧几里得算法,时间复杂度 O(nlogp)\bigO(n\log p)

k=5×108+3k=5\times 10^8+3

我们改写 S1S_1 的递归定义式子,得到 a1=S1y is a son of x’sSya_1=S_1-\sum_{y\text{ is a son of }x\text{’s}} S_y

若有 k=p12k=\frac{p-1}2,则由上文可得,当且仅当 b±1(1gp1,1gp12)b\equiv \pm 1\quad (1\equiv g^{p-1}, -1\equiv g^{\frac{p-1}2})(由欧几里得引理可以得到,mm 为奇素数时 Z/mZ\mathbb{Z}/m\mathbb{Z}a21a^2\equiv 1 有且仅有 a±1a\equiv\pm 1 两个解,于是必然有 (1)21    1gm12(-1)^2\equiv 1\iff -1\equiv g^{\frac{m-1}2})时,akba^k\equiv b 才有解;特别地,若 b0b\equiv 0,则 a0a\equiv 0

b1gp1b\equiv 1\equiv g^{p-1} 时,引理 1 中的线性同余方程可以写作 cp120(modp1)c\frac{p-1}2\equiv 0\pmod{p-1}。于是 cc 可以取任意偶数,使得 agc,akba\equiv g^c, a^k\equiv b;同理,b1b\equiv -1 时,可取任意奇数 cc 使得 (a=gc)kb(a=g^c)^k\equiv b

现在回到 a1=S1y is a son of x’sSya_1=S_1-\sum_{y\text{ is a son of }x\text{’s}} S_y 上来。我们剔除所有 Svk=0S_v^k=0 的项,检查是否存在 Svk±1S_v^k\neq \pm 1。若是,则该组数据无解。否则我们试图在整数域上最小化 a1a_1

以下所有证明,感谢李枨夏(L7-56)点拨思路。

引理 2

对于 a,a(Z/pZ)×a,a\in(\ZmpZ)^{\times},若 agca\equiv g^c,且 agd,a1ge-a\equiv g^d,a^{-1}\equiv g^e,则 ce(mod2),c≢d(mod2)c\equiv e\pmod{2},c\not\equiv d\pmod{2}

容易由 1gp12,1gp1-1\equiv g^{\frac{p-1}2},1\equiv g^{p-1}p12=5×108+31(mod2)\frac{p-1}2=5\times 10^8+3\equiv 1\pmod{2} 得证。

引理 3

对于任意常数 z(Z/pZ)×z\in(\ZmpZ)^{\times}(注意 zz00)、u,v{0,1}u,v\in\{0,1\},以及变量 c,dc,d,且满足 cu(mod2),dv(mod2)c\equiv u\pmod{2},d\equiv v\pmod{2},总能找到合适的 c,dc,d,满足 gc+gdzg^c+g^d\equiv z

证明

α\alpha 为任意不为 11(Z/pZ)×(\ZmpZ)^{\times} 内元素。令 zgez\equiv g^e,我们试图构造 gcαgege+t,gd(1α)gege+rg^c\equiv \alpha g^e\equiv g^{e+t},g^d\equiv(1-\alpha) g^e\equiv g^{e+r}

如果 c,dc,d 均与 ee 奇偶性相异,则需要满足 αgt,αgr,α+1gs\alpha\equiv g^t,-\alpha\equiv g^r,-\alpha+1\equiv g^s,其中 ts1(mod2)t\equiv s\equiv 1\pmod{2},由引理 2 得到 2r2\mid r。于是我们要求 α-\alphaα+1-\alpha+1 由原根次幂表示时,指数奇偶性依次为偶、奇;又由于 gg 的偶次幂、奇次幂分别生成 p12\frac{p-1}2(Z/pZ)×(\ZmpZ)^{\times} 中元素,且 1=gp1,2p11=g^{p-1},2\mid p-1,则由抽屉原理得到一定存在该 α\alpha

同理,如果 c,dc,d 中有一个与 ee 奇偶性相异,则要求存在次幂为“偶/偶”或“奇/奇”的邻项 α,α+1-\alpha,-\alpha+1;若 c,dc,d 均与 ee 奇偶性相同,则要求存在“奇/偶”式的邻项。在 p=109+7p=10^9+7 的条件下,这两种分界都是存在的(1,2,3,41,2,3,4 均是 gg 的偶次幂,故“偶/偶”分界存在;而有最小原根 g=5g=5,所以再次应用抽屉原理得到“奇/偶”分界存在);故而我们总是可以构造出合法的方案,使得原式成立。\square

那么,假设存在 l,l3l,l\geq 3 个及以上的非零 SvkS_v^k(对于 v1v\neq 1,我们根据引理 2 反转其符号,得到 (Sv)k=Svk(-S_v)^k=-S_v^k),我们取其中 l2l-2 个求出其任意根求和(并使和不为 00。由于每个 SvS_v 的根的多样性,这是一定存在的),然后将剩余 22SvkS_v^k 按照引理 3 构造一组解,使得其和为前述和的相反数即可;

l=2,1,0l=2,1,0 时,我们根据 SvkS_v^k 的符号分类讨论,求出最优解即可。时间复杂度 O(n+logp)\bigO(n+\log p)

C – 背包

题意简述

给定 nn 件物品,体积分别为 v1,v2,,vnv_1,v_2,\cdots,v_n;现要恰好装满一容量为 mm 的背包(n,m5000n,m\leq 5000)。求在使用物品数 cc 最少的方案中,以下各项数据的最小值:

  1. cc 件物品体积平均值;
  2. 按体积从小到大排序,第 c+12\lfloor\frac{c+1}{2}\rfloor 件物品的体积(中位数);
  3. cc 件物品体积的极差;
  4. 记该 cc 件物品的体积的众数为 tttt 出现的次数。

题解

第一问答案为 mc\frac{m}{c}

考虑将 nn 件物品排序后依次转移。我们设 f(i,x)f(i,x) 为一个二元组 (d,s)(d,s),表示考虑了前 ii 件物品的取舍,体积和为 xx 的所有方案中,满足 dd 最小的情况下,首个放入背包的物品的大小 ss 为何。转移时以 dd 为第一关键字,ss 为第二关键字。每当我们成功从 f(i,mvi+1)=(d,s)f(i,m-v_{i+1})=(d,s) 转移到 f(i+1,m)=(d+1,s)f(i+1,m)=(d+1,s) 时,若全局答案 cc 产生更新,则直接采用 vi+1sv_{i+1}-s 作为新的最小极差;否则若 d+1=cd+1=c,尝试更新极差为 vi+1sv_{i+1}-s。第三问解完。

若第二问的答案为 viv_i,则一定存在至少一个最优解的转移路径,经过了 f(i1,xvi)f(i,x)f(i-1,x-v_i)\rightarrow f(i,x)xx 取任意体积),同时有 f(i,x)=(c+12,?)f(i,x)=(\frac{c+1}2,?)。则我们以 O(nm)\bigO(nm) 的空间记录转移路径,由所有最优解作为起点逆推回去即可。第二问解完。

至此我们以 O(nm)\bigO(nm) 的时间和空间解完前三问。我们发现“存在一条最优解转移路径,对于不同的体积大小,均使用不超过 tt 个物品”关于 tt 有0/1单调性。于是二分 tt,使用多重背包结合单调队列快速进行带线性限制的转移。时间复杂度 O(nmlogn)\bigO(nm\log n),但由于内存访问连续性、局部性强(可以 O(m)\bigO(m) 逐层存储状态),实际表现非常优秀。

  • 2023年2月9日