2025.10.15 NOIP 模拟赛 题解
T1 P130051 玲珑宝塔
题意
给定 \(a_{1\sim n},k,r\),定义一个长度为 \(k\) 的序列合法当且仅当将其排序后相邻元素之不小于 \(r\),求 \(a\) 能划分出的合法序列的最大数量,\(n,k\le10^6,0\le r,a_i\le10^9\)
分析
先将 \(a\) 排序,定义划分出的序列的区间为序列中第一个元素和最后一个元素在 \(a\) 中的位置构成的区间
若存在两个序列的区间不交,则可以调整为相交,且相邻元素之差不减,因此最优情况下划分出的所有序列对应区间一定两两相交
若存在两个序列的区间互相包含,则可以调整为互不包含且相邻元素之差不减,因此最优情况下排序后划分出的所有序列左右端点都递增
对于两个划分出的两个序列 \(a_{p_{1\sim k}}\) 和 \(a_{q_{1\sim k}}\),若存在 \([p_i,p_{i+1}]\) 和 \([q_j,q_{j+1}]\) 互相包含,则可以调整为互不包含且相邻元素之差不减,若 \(p_1>q_2\) 或 \(q_1<p_2\) 则同样可以调整
综上,划分出的序列数量 \(M\) 确定的情况下,最优的划分方式一定为 \(a_{1\sim M}\) 分别作为 \(M\) 条链的开头,然后依次枚举 \(a_{M+1\sim n}\),按 \(a_1\sim a_M\) 循环的顺序依次尝试追加,若无法追加则跳过对应 \(a\)
二分答案,按上述方式判定,时间复杂度 \(O(n\log n)\)
T2 P130052 字符串转换
题意
给定 \(s_{1\sim n}\) 和 \(t_{1\sim n}\) 满足 \(s_i,t_i\in\{\text A,\text B\}\),定义一次变换为选择 \(s\) 中的一个 \(\text{AA}\) 替换为 \(\text{BA}\) 或选择一个 \(\text{BB}\) 替换为 \(\text{AB}\),\(q\) 次操作,每次操作翻转 \(s\) 或 \(t\) 的一个位置,并判断 \(s\) 能否通过若干次变换变为 \(t\),\(n,q\le3\times10^5\),多测 \(t\le10^5,\sum n,\sum q\le3\times10^5\)
分析
令 \(s\) 和 \(t\) 的奇数位置翻转,则一次变换相当于令 \(s_i\gets s_{i+1}\)
令 \(\text{A}\) 为 \(0\),\(\text B\) 为 \(1\),令 \(a\) 和 \(b\) 为 \(s,t\) 对应数组,令 \(da\) 和 \(db\) 为 \(a,b\) 对应异或差分,则 \(s\) 可以变为 \(t\) 等价于 \(a_n=b_n\) 且 \(\forall i,\sum_{j=i}^n (da_j-db_j)\ge 0\),用线段树对每个位置 \(i\) 维护 \(\sum_{j=i}^n (da_j-db_j)\),则容易做到 \(O(n+q\log n)\)
T3 P130053 监控
题意
有 \(a_{1\sim n},b_{1\sim n}\),令 \(f(x)\) 表示所有 \(s_{1\sim n}\) 满足 \(a_i\le s_i\le b_i\) 且 \(x\mid \sum s_i\) 中,\(\sum_i [s_i>a_i]\) 的最小值,若不存在这样的 \(s\) 则值为 \(0\),求 \(\sum_{x=1}^{\sum b}f(x)\),\(n\le10^5,1\le a_i<b_i\le10^5\)
分析
显然 \(\sum s_i\) 取 \(\ge \sum a_i\) 中 \(x\) 的最小倍数最优,令 \(S_a=\sum a,S_b=\sum b\),则 \(f(x)\) 等价于从 \(\{b_i-a_i\mid 1\le i\le n\}\) 中选出最少的使得和 \(\ge \left\lceil\frac{S_a}x\right\rceil\cdot x-S_a\),令 \(v_i=b_i-a_i\) 并从大到小排序,求前缀和,容易 \(O(\log n)\) 求一个 \(f(x)\)
考虑分治,令阈值为 \(B\)
当 \(x\le B\) 时,直接计算,这部分时间复杂度 \(O(B\log n)\)
当 \(x>B\) 时,\(\left\lceil\frac{S_a}x\right\rceil\) 只有 \(O(\frac{S_a}B)\) 种可能,每种可能中容易 \(O(n)\) 求出贡献,这部分时间复杂度 \(O(\frac{S_a}B\cdot n)\)
总时间复杂度 \(O(B\log n+\frac{S_a}B\cdot n)\),取 \(B=\sqrt{\frac{nS_a}{\log n}}\) 可做到 \(O(\sqrt{nS_a\log n})=O(n\sqrt{V\log n})\)
T4 P130054 三元组
题意
给定 \(n+1\) 个三元组 \((a_i,b_i,c_i)\mid_{i=0}^n\),其中 \(a,b,c\) 分别为 \(0\sim n\) 的排列,定义 \((a,b,c)<(d,e,f)\) 当且仅当 \([a<d]+[b<e]+[c<f]\ge 2\),将三元组重排,求出从 \((a_0,b_0,c_0)\) 开始的递增子串的最大长度(\((a_0,b_0,c_0)\) 不计入长度),\(n\le2\times10^5\),多测 \(T\le10^4\),\(\sum n\le2\times10^5\)
分析
方法 1
若 \((a_i,b_i,c_i)<(a_j,b_j,c_j)\) 则 \(i\to j\),显然得到竞赛图,转化为竞赛图上最长链
每次选出 \((a,b,c)\) 之二,显然建图的限制为二维偏序,树状数组优化建图即可,最后求出可达点数量,显然能组成最长链,时间复杂度 \(O(\sum n\log n)\),空间复杂度 \(O(\max n\log n)\)
方法 2
通过容斥求出每个点的入度,使用兰道定理求出 \(\text{SCC}\),显然需要三维偏序,时间复杂度 \(O(\sum n\log^2 n)\),空间复杂度 \(O(\max n)\)
方法 3
该方法可求出具体方案
维护两条链 \(L_1,L_2\),初始 \(L_1\) 为空,\(L_2\) 只含 \((a_0,b_0,c_0)\),每次取出 \(L_2\) 的第一个点加入 \(L_1\) 尾部,同时枚举该点能直接到达且不在 \(L_1,L_2\) 中的点,将它插入 \(L_2\) 中第一个满足前一个元素连向它且它连向后一个元素的位置,显然一定存在这样的位置
使用线段树优化枚举的过程,使用平衡树优化插入的过程,可以做到 \(O(\sum n\log n)\) 并求出具体方案
比赛结果
\(100+60+55+22\),\(\text{rk}19\)

浙公网安备 33010602011771号