是的,我真开了这个坑。
P9993 [Ynoi Easy Round 2024] TEST_133
序列,支持两个操作:
l r v
对区间 \([l,r]\) 的所有数加 \(v\)。l r x
对区间 \(a_i < x\) 的 \(i\) 位置查询历史最大和。
\(1 \leq n,m \leq 5\times 10^5 , |a| \leq 10^9\),时限 40s。
发现这东西不同于线段树 3,而且给了 40s 的时限,所以直接考虑分块。
我们可以类比吉司机树, his_i
表示 \(i\) 点的历史和,histag
表示第 \(i\) 个块的历史最大 tag,其实一开始想再开一个笔记写吉司机树的,但感觉确实没啥可写的,如果有必要就放到之后再写吧。
由于是查询 \(a_i < x\) 的历史最大和,我们类比教主的魔法,对块内排序,然后维护 prehis
表示块内前缀历史和,每次查询时二分即可。
这题很好写,分块将每个部分的功能分开写会很简单并且逻辑很好串起来。
时间复杂度 \(O(n \sqrt n \log n)\),最慢点跑了 23s。
code
P9994 [Ynoi Easy Round 2024] TEST_132
给定二维平面上 \(n\) 个点,点互不相同,点带权,支持两个操作:
v
对 \(x=v\) 的所有点权值平方。v
求 \(y=v\) 的所有点的权值和。
\(1 \leq n,m \leq 1.2 \times 10^6,1 \leq x,y \leq n\)。
正解好像是光速幂不带 \(\log\),但是快速幂卡过去了。
考虑根号分治,按照 \(x_i\) 的数量 \(siz\) 分类,对于 \(siz \leq V\) 的,操作一暴力修改,操作二直接查询,复杂度 \(O(nV)\),对于 \(siz > V\) 的,操作一打标记,操作二挨个查询,因为同 \(y\) 中最多只有 \(V\) 个 $x_i $ 数量 $ > V$ 的,因此复杂度是 \(O(\frac{n^2}{V} \log 10^9)\),当 \(V = 3100\) 左右时能够通过。
注意模指数时用到费马小定理,模 \(mod-1\) 即可,以及一些什么乱七八糟的常数处理,比如减少数组调用,改用 vector
之类的。
卡了一下午常数,复杂度大概 \(O(n\sqrt{n \log V})\)。
code