NOIP2022 T4 题解

\(P8868\)

\(1\)~\(2\) 写你喜欢的暴力,复杂度\(O(Qn^3)\),期望得分\(8pts\)

\(3\)~\(5\) 先预处理每个区间的最大值,查询用二维前缀和,复杂度\(O(n^2+Q)\),期望得分\(20pts\),也是本题的大众分。

本题的正解做法较多,这里仅展示线段树维护历史和做法。

\(6\)~\(25\) 在线不太好做,考虑离线,按\(r\)排序。于是我们可以把问题转化一下:设\(A_l\)表示\(a_l-a_r\)的最大值,其中\(r\)是递增枚举的。也就是说,\(A\)动态维护的。同理,\(B_l\)表示\(b_l-b_r\)的最大值。设\(S_l=A_l\times B_l\)。那么,每枚举一个\(r\),就要找到对于\(a\)\(r\)前面第一个比它大的位置\(posa\)。把\(A_{posa+1}-A_r\)赋值\(a_r\)。同理,对于\(b\),找到\(r\)前面第一个比它大的位置\(posb\)。把\(B_{posa+1}-B_r\)赋值\(b_r\),同时更新\(S_i\),这个可以用单调栈实现。那查询\((l,r)\)就是在问枚举到\(r\)时,\(S_i\)的历史和之和,其中\((l\le i\le r)\)。这个过程可以用线段树维护历史和实现,对每个区间维护\([length,suma,sumb,sums,history]\),转移矩阵懒得摆了。复杂度\(O(125(n+Q)logn)\),无法通过。但是,我们发现只有矩阵中只有\(12\)个元素是有用的,于是我们维护\(12\)\(tag\),手动矩阵乘法即可,复杂度\(O(40(n+Q)logn)\),可以通过,期望得分\(100pts\)

最后来一句,相信\(NOIP\),实力到了,就一定能考出来!

posted @ 2025-08-20 19:04  captainOI  阅读(16)  评论(0)    收藏  举报