Akane-Weekly #11NOIP 十连测 (9)
Akane-Weekly #11:NOIP 十连测 (9)
林俊杰 Round.
以后不放代码了,好占空间。
A.
暴力是 \(O(n^2)\) 。
多序列问题考虑长度根号分治,长度 \(\le B\) 的直接双指针暴力,时间复杂度 \(O(mB)=O(nB)\) 。
一个长度小于等于 \(B\),一个长度大于 \(B\),由于大于 \(B\) 的最多只有 \(\frac{n}{B}\) 个,直接前缀和预处理,再暴力做短的就好了,时间复杂度同上。
对于两个都很长的部分,总共的排列选择只有 \(\frac{n^2}{B^2}\) 种,远小于询问次数,可以记忆化优化,由于所有串长度之和为 \(n\) ,每一个串作为前面部分时最多和其它 \(\frac{n}{B}\) 都做一次,所以总时间复杂度 \(O(\frac{n^2}{B})\) 。
平衡两种情况的时间复杂度,可以令 \(B=\sqrt{n}\) ,总时间复杂度 \(O(n^\frac{3}{2})\) 。
备注:出题人没有构造每一个子序列长度都是 \((\sqrt{n}+c)\) 的极限数据,所以数据很水,你甚至可以用 \(O(n^{\frac{5}{3}})\) 的做法跑过去。
B.
区间离散化,每次单点修改对一些的区间有贡献。
如果我们朴素地排序,那么这些被贡献的区间无法连续,不能优化时间复杂度。
不难发现区间满足包含必然不优,删去,剩下区间排序后可同时满足左右端点单增,所以每次修改都是连续段。
二分找到连续段,线段树暴力维护即可,时间复杂度 \(O(n \log n)\) 。
C.
比较智慧的做法。
枚举第 \(k\) 大的点,把比它大的点给一个点权 \(1\) ,比它小的给点权 \(0\) ,我们从小到大枚举点,相当每次把一个点从 \(1\) 变成 \(0\),考虑它变成 \(0\) 之前对答案的贡献,那么答案区间一定是某一个过这个点且包含 \(k\) 个 \(1\) ,每次这样的区间有 \(O(k)\) 个,暴力枚举,用 \(O(1)\) 回答一段 rmq 即可。
时间复杂度 \(O(nk)\)。
D.
等讲评发了再写。

浙公网安备 33010602011771号