2025.12.20 NOI 模拟赛 题解

比赛

订正

T1 P130199 [省选二十连测第六套 ] --T1--游戏

题意

给定 \(a_0\)\((a_i,h_i)\;(1\le i\le n)\),重排 \((a,h)\) 得到 \(a_{0\sim n}\)\(h_{1\sim n}\),求能得到的 \(\sum_{i=1}^n \left\lceil\frac{h_i}{\max a_{0\sim i-1}}-1\right\rceil a_i\) 的最小值,\(1\le n,a_i,h_i\le2\times10^5\)

分析

先令所有 \(h_i\) 减一则转化为求 \(\sum_{i=1}^n \left\lfloor\frac{h_i}{a_{0\sim i-1}}\right\rfloor a_i\) 的最小值

显然整个求和过程可以分为两部分:\(\max a_{0\sim i-1}\) 递增,和其取到最大值

\(M=\max a_i\),则后一部分贡献为 \(\sum_{i=1}^n \left\lfloor\frac{h_i}{M}\right\rfloor a_i\)

考虑求出前一部分中扣除后一部分的贡献,显然前一部分中每个 \(a\) 都是前缀最大值,否则将其放入后一部分不劣

\(dp_i\) 表示放置了 \(a\ge i\) 的部分的贡献,则

\[dp_M=0 \]

\[dp_i=\min_{a_j>i}\left(dp_{a_j}+\left\lfloor\frac{h_j}M\right\rfloor a_j-\left\lfloor\frac{h_j}i\right\rfloor a_j\right) \]

枚举 \(\left\lfloor\frac{h_j}M\right\rfloor\),维护一棵线段树,其位置 \(p\) 维护了所有 \(h_j=p\)\(j\),则转化为单点加入一次函数,区间查询所有一次函数在给定位置的最小值

插入的一次函数斜率递减,查询位置递增,每个区间维护一个单调队列即可

时间复杂度 \(O((V\ln V+n)\log V)\)

代码

T2 P130198 [省选二十连测第六套 ] --T2--最小费用

题意

给定一棵 \(n\) 个结点的树和 \(a_{1\sim n},b_{1\sim n}\),将树上结点 \(u\) 和下标 \(i\) 匹配,一组 \((u,i)\) 的代价为 \([u\in \text{subtree}(a_i)]b_i\),求最小权完美匹配并构造方案,\(n\le2\times10^5\),多测 \(\sum n\le10^6\)

分析

对于一组 \((a_i,b_i)\)\(b_i\) 放到点 \(a_i\) 上,则等价于对于每个挂在 \(u\) 上的 \(b\) 匹配点 \(v\),若 \(v\) 在子树 \(u\) 内则代价为 \(b\)

对于每个结点 \(u\) 维护一个大根堆 \(H_u\) 保存子树内还没有匹配的 \(b\),初始保存所有挂在 \(u\) 上的 \(b\)

\({ct}_u\) 表示子树 \(u\)\(b\) 的数量

\(U_u\) 表示子树 \(u\) 内还没有匹配的点的集合,令 \(M_u\) 表示子树 \(u\) 内已经匹配的点的集合

初始两者为空,然后依次枚举 \(u\) 的儿子 \(v\)

尝试匹配 \(H_v\) 中元素和 \(U_u\) 中元素,尝试匹配 \(H_u\) 中元素和 \(U_v\) 中元素

对于 \(M_u\) 中元素,可以尝试与 \(H_v\) 配对,一个配对相当于修改其匹配的元素,显然不劣,\(M_v\)\(H_u\) 同理

最后将 \(H_v,M_v,U_v\) 合并入 \(H_u,M_u,U_u\)

显然上述四项尽量取满后一定不劣

\(\text{DSU}\) 时间复杂度 \(O(n\log^2 n)\),使用可并堆并精细实现可以做到 \(O(n\log n)\)

代码

T3 P130200 [省选二十连测第六套 ] --T3--城市距离

题意

给定 \(m\) 个字符串,总长为 \(n\),只含前 \(k\) 个小写字母,给每个字符编号 \(1\sim n\),同一串中相邻字符距离为 \(1\),同种字符距离为 \(1\),求两两最短路之和,\(m\le n\le10^6\)\(k\le16\),多测 \(T\le 3\)

分析

\(\text{bfs}\) 求出 \(f_{i,c}\) 表示从编号 \(i\) 出发走到任意一个字符 \(c\) 的最短距离,\(g_{a,b}\) 表示任意一个字符 \(a\) 和任意一个字符 \(b\) 之间的最短距离,这部分容易做到 \(O(kn)\)

称通过同种字符移动为跳跃

先假定最短路必须经过一次跳跃,显然 \(\text{dis}(i,j)=\min_c (f_{i,c}+f_{c,j}+1)\)

显然最短路长度不超过 \(2k-1\),对于最短路不需要跳跃的点对,显然只有 \(O(kn)\) 对,它们在 \(\min_c (f_{i,c}+f_{c,j}+1)\) 基础上的增量容易 \(O(k^2 n)\) 算出

以下只考虑统计 \(\sum_i \sum_j \min_c (f_{i,c}+f_{c,j}+1)\)

\(s_i\) 表示编号 \(i\) 的字符,\(s_i=s_j\) 的情况是容易的

对于 \(s_i\ne s_j\) 的情况,枚举 \(a=s_i,b=s_j\),考虑统计相应的贡献

\(D=\min_c (g_{a,c}+g_{b,c}+1)\)

显然 \(g_{s_i,c}\le f_{i,c}\le g_{s_i,c}+1\),因此 \(D\le \text{dis}(i,j)\le D+2\),即 \(\text{dis}(i,j)\) 只有三种取值

考虑求出 \(\text{dis}\) 等于 \(D\)\(D+2\) 的方案数,容易得到 \(D+1\) 的方案数从而计算贡献

\(\text{dis}\) 等于 \(D\) 当且仅当点对 \((i,j)\;(s_i=a,s_j=b)\) 满足存在 \(d\) 使得 \(f_{i,d}=g_{a,d},f_{j,d}=g_{b,d},g_{a,d}+g_{b,d}+1=D\)

求出 \(ms=\{d\mid g_{a,d}+g_{b,d}+1=D\}\),对于每个 \(i\) 容易预处理 \(S_i=\{d\mid f_{i,d} =g_{s_i,d}\}\),点对合法当且仅当 \((S_i\cap ms)\cap (S_j\cap ms)\ne \varnothing\)

容易用 $\text{FWT} $ 统计,时间复杂度 \(O(k^2\times k2^k)\)

\(\text{dis}\) 等于 \(D+2\) 当且仅当点对 \((i,j)\) 满足 \(\nexists d, f_{x,d}=g_{a,d},g_{a,d}+g_{b,d}+1=D\)\(\nexists d, f_{y,d}=g_{b,d},g_{a,d}+g_{b,d}+1=D\)\(\nexists d, f_{x,d}=g_{a,d},f_{x,d}=g_{a,d},g_{a,d}+g_{b,d}+1=D+1\)

前两个条件只和 \(i\) 或只和 \(j\) 有关,第三个条件处理类似 \(\text{dis}=D\) 的情况

总时间复杂度 \(O(\sum (k^32^k+nk^2))\)

代码

比赛结果

\(10+30+20\)\(\text{rk}6\)

posted @ 2025-12-22 15:54  Hstry  阅读(5)  评论(0)    收藏  举报