2025.10.12 NOIP 模拟赛 题解
T1 P130047 图灵完备
题意
给定一张 \(n\) 个点的边带权图,定义两点之间路径的权值为路径上边权值的异或和,求出选择一个点作为根时,其它点到它的路径权值之和的最小值,\(n\le2\times10^5\)
分析
考虑对于每个点求出它为根时的答案
显然各位独立,因此分开处理
单独考虑每一位,求出 \(0\) 边的连通块,则同一连通块内路径权值为 \(0\),否则为 \(1\),因此这一位的贡献为 \(n-sz\),其中 \(sz\) 为当前点的连通块大小
时间复杂度 \(O(n\alpha(n)\log V)\),容易做到 \(O(n\log V)\)
T2 P130048 异或高位
题意
令 \(G(x,y)\) 为 \(x\oplus y\) 的最高二进制位(若 \(x=y\) 则 \(G(x,y)=0\)),定义 \(f(a_{1\sim l})\) 值为每次从 \(\{a\}\) 中取出两个数 \(x,y\) 然后放回 \(G(x,y)\),最终剩下数的最小值,给定 \(a_{1\sim n}\) 求出 \(\sum_{1\le l\le r\le n} f(a_{l\sim r})\),\(n\le10^5\)
分析
记 \(x\circ y=G(x,y)\)(左结合)
先考虑如何计算 \(f(a_{1\sim l})\)
\(a_{1\sim l}\) 都是 \(0\) 时显然值为 \(0\),否则令 \(b\) 为 \(\max a\) 的最高二进制位(\(\lfloor\log_2 \max a\rfloor\))
令 \(s\) 为 \(\{a\}\) 中第 \(b\) 位为 \(1\) 的数的数量,当 \(s\) 为奇数时显然 \(f(a_{1\sim l})=2^b\)
当 \(s\) 为偶数时,若 \(s=2\) 且 \(l\ge s+2=4\) 时,不妨设 \(s\) 对应的两个数为 \(a_1\) 和 \(a_3\),则 \(a_1\circ a_2=2^b\),\(a_3\circ a_4\circ\cdots \circ a_l=2^b\),两者再进行合并为 \(0\)
若 \(s\ge 4\) 且 \(l\ge s+1=5\),不妨设 \(s\) 对应 \(a_{1\sim s}\),则 \(a_1\circ a_2\circ a_3=2^b\),\(a_4\circ a_5\circ \cdots \circ a_l=2^b\),两者合并得 \(0\)
若 \(s=l\) 显然能得到 \(0\)
综上,\(l\ge 5\) 时 \(f(a_{1\sim l})=(s\bmod 2)2^b\)
令 \(f'(a_{1\sim l})=(s\bmod 2)2^b\),则转化为求 \(\sum_{1\le l\le r\le n} f'(a_{l\sim r})-\sum_{1\le l\le r\le n,r-l+1\le 4}(f'(a_{l\sim r})-f(a_{l\sim r}))\),后一部分容易做到大常数 \(O(n)\),对于前一部分令 \(b_i\) 为 \(a_i\) 的最高二进制位(若 \(a_i=0\) 则 \(b_i=-1\)),则先处理包含 \(\max b\) 的所有区间,然后递归处理所有不含 \(\max b\) 的极大子段,容易做到 \(O(n\log V)\)
总时间复杂度 \(O(n\log V)\)
T3 P130049 数树
题意
给定 \(n,k\),求出所有 \(n\) 个点的 \(\text{AVL}\) 中恰有 \(k\) 个点左右子树不等高的数量,对给定充分大质数取模,\(n\le10^8,k\le100\)
分析
假定所有儿子数量为 \(1\) 的结点下空的位置有一个虚拟的空结点
令 \(f_{x,y,k}\) 表示一棵 \(\text{AVL}\) 中叶子有 \(x\) 个,虚拟空结点有 \(y\) 个,左右子树不等高的有 \(k\) 个的方案数
儿子数量为 \(0\) 的点有 \(x\) 个,儿子数量为 \(1\) 的点有 \(y\) 个,儿子数量为 \(2\) 的点有 \(n-x-y\) 个,从而 \(2(n-x-y)+y=n-1\),得到 \(x=\frac{n+1-y}2\),\(n=2x+y-1\)
显然 \(y\le k\),因此答案为 \(\sum_{y=0}^k [(n+1-y)\mid 2]f_{\frac{n+1-y}2,y,k}\)
显然 \(f_{\le 0,\ast,\ast}=0\),\(f_{x,y,0}=[y=0\land (\exists u,x=2^u)]\)
转移时,枚举 \(0\le s\le k-y\) 表示删去 \(x\) 个结点后虚拟空结点的数量,当前状态对应 \(n\) 为 \(2x+y-1\),上一状态对应 \(n\) 为 \(2x+y-1-x=x+y-1\),上一状态对应 \(y\) 为 \(s\),上一状态对应 \(x\) 为 \(\frac{(x+y-1)+1-s}2=\frac{x+y-s}2\),对应 \(k\) 为 \(k-y\),因此从 \((\frac{x+y-s}2,s,k-y)\) 转移到 \((x,y,k)\)
因为左右儿子高度差不超过 \(1\),因此 \(y\) 个结点的兄弟一定都是叶子
即删去 \(x\) 个叶子后,原本的 \(y\) 个空结点都对应一个叶子(对应它的父亲)(在这 \(y\) 个的基础上还有其它一些也变成叶子,这些结点有两个叶子结点),因此要从上一层的 \(\frac{x+y-s}2\) 个叶子中选择 \(y\) 个对应下一层的空结点,每个有左右儿子两种选择,因此系数为 \(\binom{\frac{x+y-s}2}y2^y\)
即转移为
使用记忆化搜索,树 \(O(\log n)\) 层,每层访问 \(O(k)\) 种大小,每种 \(n\) 有 \(O(k^2)\) 个 \((x,y)\),每个 \(f_{i,j,k}\) 需要 \(O(k)\) 枚举 \(s\),每个 \(s\) 需要 \(O(k)\) 计算组合数,时间复杂度 \(O(\log n\cdot k\cdot k^2\cdot k\cdot k)=O(k^5\log n)\),常数极小
T4 P130050 子段
题意
给定 \(x_{1\sim n}\),令 \(a_i=\text{sgn} x_i\cdot 2^{|x_i|}\),求出 \(a\) 的最大子段和,\(1\le |x_i|\le 10^9\)
分析
依次扫描 \(a_{1\sim n}\),令 \(sm\) 为此时最大后缀和,令 \(rs\) 为此时最大子段和,令 \(df=rs-sm\)
加入 \(\pm 2^x\) 时,\(sm\) 加上对应值,\(df\) 减去对应值
若 \(sm<0\) 则 \(df\gets df+sm,sm\gets 0\)
若 \(df<0\) 则 \(df\gets 0\)
考虑如何维护 \(sm\) 和 \(df\)
每个数字保存 \(\{(p,v)\}\),表示其值为 \(\sum_{(p,v)} v\cdot 2^p\),其中 \(v\in\{-1,0,1\}\)
加入 \(\pm 2^x\) 时先修改对应 \((p,v)\),若 \(|v|\ge 2\) 则不断进位
时间复杂度显然为 \(O(n\log n+n\log \frac Vn)=O(n\log \max(n,V))\)
比赛结果
\(100+0+0+75\),\(\text{rk}33\)

浙公网安备 33010602011771号