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.

等讲评发了再写。

posted @ 2023-11-06 15:12  ArizonaYYDS  阅读(30)  评论(0)    收藏  举报