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\)

即转移为

\[\binom{\frac{x+y-s}2}y2^y f_{\frac{x+y-s}2,s,k-y}\to f_{x,y,k} \]

使用记忆化搜索,树 \(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\)

posted @ 2025-10-13 13:30  Hstry  阅读(15)  评论(0)    收藏  举报