2025.11.29 NOIP
\(8:30\) 开始,先看 \(\text T1\),经过几次尝试大约 \(8:50\) 之前通过大样例
看 \(\text T2\),一定程度上承接自 \(\text T1\),试着写暴力,结果没过样例,想到近 \(10\) 点,于是放弃
看 \(\text T3\),一段时间后想到 \(dp\):令 \(f_{u,i,j}\) 表示子树 \(u\) 中确定的值的 \(\text{mex}\) 为 \(i\),还有 \(j\) 个位置没有确定的方案数,转移为 \(f_{u,i,j}+f_{v,I,J}\to f_{u,\max(i,I),j+J}\),\(f_{u,i,j}\to f_{u+1,j-1}\),\(f_{u,i,j}\gets f_{u,i,j}+i\),暴力为 \(O(n^5)\),可以分析到 \(O(n^4)\)
回头调出 \(\text T2\) 的暴力,得到 \(20pts\)
看 \(\text T4\),想到 \(O(qn^2)\) 的算法,过 \(15pts\)
将 \(\text T3\) 的 \(dp\) 优化到 \(O(n^3)\),一共 \(48pts\)
做 \(\text T4\) 的特殊性质 \(A,B\),又 \(25pts\)
看到 \(\text{T2}\) 的第 \(18\) 个点输出 \(2^n\) 即可,于是又 \(4pts\)
之后尝试 \(\text T2\) 的 \(B\) 性质未果
预计 \(100+24+48+40\)
赛后发现 \(\text T2\) 的 \(m=2n-1\) 的 \(4\) 分只需要判所有都是 \(2\) 得到情况即可,\(m=2n-2\) 只要 \(O(n)\) 种情况即可,赛场上没有注意到
从题解上看 \(\text T2\) 最基础的性质应当是十分自然的,但赛场上由于只顾着写暴力及其他奇怪的原因而没想到,或有所感觉但没细想
这场冲 \(\text T2\) 未果心态炸了的人似乎很多
T1 P14635 [NOIP2025] 糖果店 / candy(官方数据)
相当于 \(\{x\}\) 中每个选至多一次,\(\{x+y\}\) 中每个选任意次,前者降序排序后选择前缀,后者选最小的一项,因此枚举前者选择的数量即可,时间复杂度 \(O(n\log n)\)
T2 P14636 [NOIP2025] 清仓甩卖 / sale(官方数据)
考虑计算没有取到最大值的方案数
预先将 \(a\) 从大到小排序
设被选且 \(w=1\) 部分(显然 \(w=1\) 中选择一个前缀)\(a\) 最小的为 \(a_j\),没有被选且 \(w=1\) 部分最大为 \(a_k\)(设 \(a_{n+1}=0\),则 \(k=n+1\) 表示 \(w=1\) 部分全选)
设被选部分 \(w=2\) 中 \(a\) 最小为 \(a_i\)
若满足 \(a_j<a_i<2a_j\) 且 \(a_j+a_k<a_i\),则根据贪心策略会选 \(a_j\) 和 \(a_k\),而最优策略选择 \(a_i\),两者不同
枚举 \(a_i\),枚举 \(j\) 满足 \(a_j<a_i<2a_j\),则满足 \(a_j+a_k<a_i\) 的为一段后缀,双指针出其范围 \(k\in [c,n+1]\)
\((k,n]\) 部分 \(w\) 任意,有 \(2^{\max(0,n-k)}\) 种方案;\(k\) 位置 \(w=1\);\((j,k)\) 部分 \(w=2\);\(j\) 位置 \(w=1\);\([1,i)\) 中的 \(1/2\) 和 \((i+1,j]\) 中的 \(w\) 总和为 \(m-1\),枚举 \(u\) 为 \([1,i)\) 中 \(2\) 的数量,\(v\) 为 \((i+1,j)\) 中 \(1\) 的数量,方案数为 \(\sum_{u=0}\sum_{v=0}[i-1+u+v+1=m-1]\binom{i-1}u\binom{j-i-1}v=\sum_u \binom{i-1}u \binom{j-i-1}{m-1-i-u}=\binom{j-2}{m-1-i}\)
容易做到 \(O(\sum n^2)\)
T3 P14637 [NOIP2025] 树的价值 / tree(官方数据)
令 \(a_u\) 表示点 \(u\) 填的数,令 \(s_u\) 表示子树 \(u\) 内 \(a\) 的 \(\text{mex}\)
定理 \(1\):最优情况下对于每个 \(u\ne 1\),有 \(a_u<a_{f_u}\)
证明:
- \(a_u=a_{f_u}\) 时令 \(a_{f_u}=a_u+1\),显然 \(u\) 到根的链上 \(s\) 不降,其余不变,不劣
- \(a_u>a_{f_u}\) 时,显然 \(a_u\ne s_u\),若 \(a_u>s_u\) 则交换 \(a_u\) 和 \(a_{f_u}\) 显然所有 \(s\) 不变,不劣,否则有 \(a_{f_u}<a_u<s_u\),令 \(a_{f_u}=a_u+1\) 显然 \(f_u\) 到根的链上 \(s\) 不降,其余不变,不劣
显然 \(s_u\ge \max_{v\in\text{son}(u)}s_v\),令取到 \(>\) 的为 \(A\) 类点,取到 \(=\) 的为 \(B\) 类点
显然根取 \(A\) 类点必然不劣
定义 \(x\) 贡献到 \(y\) 当且仅当 \(y\) 是 \(x\) 的祖先中第一个满足 \(s_y>a_x\) 的点
定理 \(2\):每个 \(B\) 类点必然贡献到它的祖先中第一个 \(A\) 类点
证明:
- 考虑从根向下归纳
- 若 \(B\) 类点 \(u\) 贡献到 \(B\) 类点 \(v\),设 \(v\) 贡献到 \(A\) 类点 \(w\),说明 \(s_v=\max_{v'\in\text{son}(v)} s_{v'}\) 且 \(u\) 所在的那个儿子 \(s\) 没有取到最大值,此时 \(a_v<s_v\),令 \(a_v=\max_{v'\in\text{son}(v)} s_{v'}\) 后,\(s_v\) 加一,且 \(v\) 变为 \(A\) 类点,\(v\) 到根的链上 \(s\) 不降,不劣
- 若 \(B\) 类点 \(u\) 贡献到 \(A\) 类点 \(v\),而 \(u,v\) 之间存在一个 \(A\) 类点 \(w\),则 \(s_u<s_w<s_v\),\(s_w<a_u<s_v\),在 \(\text{subtree}(w)/\text{subtree}(u)\) 中必然存在 \(a=s_u\sim s_{w-1}\),\(\text{subtree}(v)/\text{subtree}(w)\) 中必然存在 \(a=s_w\sim s_v-1\),从后者中选择一个 \(=a_u\) 的与 \(a_u\) 交换,显然不劣
定理 \(3\):每个 \(A\) 类点必然贡献到自身
证明:
- 对于一个 \(A\) 类点 \(u\),考虑子树 \(u\) 内贡献到 \(u\) 及 \(u\) 之外的点的集合 \(S\)
- 显然对于 \(u\) 点及子树 \(u\) 之外的部分,只有 \(|S|\) 有用
- 若 \(u\notin S\),即 \(u\) 不贡献到任何点,则 \(u\) 贡献到自身一定不劣
- 若 \(u\in S\) 且 \(u\) 不贡献到自身:
- 若 \(|S|>1\),则取 \(v\in S,u\ne v\) 交换两者贡献到的,显然不劣
- 否则子树 \(S\) 内都是 \(A\) 类点,必有 \(a_u=s_u\),即 \(u\) 贡献到自身
由此对于 \(A\) 类点 \(u\),\(s_u\) 等于 \(\max_{v\in\text{son}(u)} s_v+1\) 加上贡献到 \(u\) 的 \(B\) 类点数量
将其弱化为每个 \(A\) 类点 \(u\) 在 \(\max_{v\in\text{son}(u)} s_v\) 的基础上选择子树内一个 \(A\) 类点加一加上贡献到 \(u\) 的 \(B\) 类点数量,显然不劣
若 \(u\) 选择了 \(v\in\text{subtree}(u)\),则 \(\text{path}(u,v)\) 上都是 \(A\) 类点,否则将 \(B\) 类改为 \(A\) 类一定不劣,且链上所有点都选择了 \(v\)
由此可以将原树划分为若干链和散点,每条链上都是 \(A\) 类点,散点都是 \(B\) 类点
对于一个 \(B\) 类点,其贡献等于子树内贡献最大的 \(A\) 类点的贡献,称该 \(B\) 类点依赖于此 \(A\) 类点
显然依赖于同一 \(A\) 类点的 \(B\) 类点为一条链,且被依赖的 \(A\) 类点为它所在 \(A\) 类点链的顶部,两条链相邻,可以将两者合并为一条链
转化为将原树划分为若干直链,对于每条直链,其上半部分为 \(B\) 类点,下半部分为 \(A\) 类点,两部分都可空(当下半部分可空时认为 \(B\) 类点的贡献为 \(0\))
修改贡献计算的方式,原本 \(B\) 类点的贡献等于它所在链中最浅的 \(A\) 类点的贡献,修改为在考虑该 \(A\) 类点时即计入其上方的 \(B\) 类点的贡献;原本 \(A\) 类点的贡献等于子树内最大的 \(s\) 加一加贡献到它的 \(B\) 类点数量,修改为每个 \(A\) 类点贡献到它到根的链上每一个 \(A\) 类点,且每个 \(B\) 类点贡献到它到根的链上每个 \(A\) 类点
考虑对此结构 \(dp\),令 \(f_{u,i},g_{u,i}\) 表示点 \(u\) 为 \(A/B\) 类点,它到根的链上有 \(i\) 个 \(A\) 类点,子树 \(u\) 内的最大贡献,令 \(s_{u,i}=\sum_{v\in\text{son}(u)} g_{v,i}\)
对于 \(f\),若它为所在 \(A\) 链底,则贡献为 \(i+s_{u,i}\),否则枚举链下一个点为 \(v\),贡献为 \(i+s_{u,i}-g_{v,i}+f_{v,i+1}\),即
对于 \(g\),若它子树内不含 \(A\) 类点,则贡献为 \(sz_u\times i\),否则枚举下一个 \(A\) 类点为 \(v\),贡献为 \(i(i-1)+f_{v,i}+\sum_{x\in\text{path}(u,v)}(s_{x,i}-g_{x,i})+g_{u,i}-s_{v,i}\),此时要求 \(d_v-d_u+1=i\),其中 \(i(i-1)\) 是对中间 \(i-1\) 个 \(B\) 类点的贡献
直接 \(dp\) 容易做到 \(O(\sum nm^2)\)
建立 \(m\) 个树状数组,分别对每个 \(i\) 和每个 \(v\) 维护 \(i(i-1)+f_{v,i}+\sum_{x\in\text{path}(u,v)}(s_{x,i}-g_{x,i})+g_{u,i}-s_{v,i}\),时间复杂度 \(O(\sum nm\log n)\)
T4 P14638 [NOIP2025] 序列询问 / query(官方数据)
令 \(s\) 为 \(a\) 的前缀和
对于一组询问 \((L,R)\),枚举右端点 \(r\),则对应左端点在 \([r-R+1,r-L+1]\) 中
令 \({rs}_i\) 表示位置 \(i\) 的答案,则对于每个 \(l\in [r-R+1,r-L+1]\) 都要令 \({rs}_{l\sim r}\gets s_r-s_{l-1}\)
从右往左扫描 \(r\),同时维护此区间内的单调队列,可以将对 \(rs\) 的区间操作总长度降到 \(O(n^2)\),由此得到 \(O(qn^2)\) 的算法
此时的区间操作分为两类,一类为每个 \(r\) 队列最后一项到 \(r\) 的区间修改,另一类形如 \((i+1,nx_i)\),其中 \(nx_i\) 为 \(i\) 之后第一个 \(<s_i\) 的位置
对于前者,发现左右端点都递增,容易一次单调队列实现
对于后者,发现 \((i+1,nx_i)\) 的区间包含成树的形态,预处理树的结构,依次扫描时从父亲贡献到儿子即可
总时间复杂度 \(O(qn+n\log n)\)
upd25.12.3:出分了,没有挂

浙公网安备 33010602011771号