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

posted @ 2025-10-17 14:56  Hstry  阅读(6)  评论(0)    收藏  举报