线下春眠做噩梦
牢骚:完蛋了,每天都欠一屁股债,那么多题没补,我要爆炸了!😭
以及,我讨厌 lxl 。还有,zjk 你会说话就多说点。
《CF1446D2 Frequency Problem》
不要直接想 \(\text{two pointers}\) 😢
注意到 原序列众数必然作为子段众数出现(子段 \(=\) 原序列往内缩),减小了枚举量。
注意到 枚举的另一众数不需是众数(若 \(cnt(j)>cnt(i)=cnt(\lambda)\),则存在严格更大的 \(cnt(j)=cnt(\lambda)\) 子段,若还有 \(j'\) 则继续调整),简化了问题。
注意到只有 \(cnt(i)\) 个有效区间。类似 [SDOI/SXOI2022] 整数序列 了。可以 \(\mathcal O(n)\) 解决。
《CF1340F Nastya and CBS》
统一所有种类括号的贡献。因此只能使用 哈希 处理匹配的括号。
带修改,考虑线段树。欲知中间的括号是否匹配,只需查询出某个区间(线段树节点)的右数(或左数)\(x\) 个左(或右)括号的哈希值。
类似 楼房搭建,每次 在线段树上递归 的查询这玩意儿。如果涉及两个子节点,则右儿子的右括号是完整的,不递归(已存储为节点信息);左儿子的右括号有一部分先和右儿子的左括号抵消了,设计一个可减的哈希值即可,比如 \(\{a_i\}\) 对应 \(\sum_{i=0}^{n-1}a_iv^i\) 这种简单哈希,就可以直接减去右儿子的左括号的哈希值(涉及到的哈希值都顺带求了其 \(\rm flip\) 后的结果,为了判断括号匹配),只递归一次左儿子。复杂度 \(\mathcal O(n\log^2 n)\) 。
《洛谷 P7290 暴力出奇迹》
写偏序关系。贡献形式是 \(l_q\leqslant i_m\leqslant r_q\) 且 \(l_m\leqslant i_q\leqslant r_m\),即立方体 \(+1\) 和 \(1\times 1\times L\) 的长条形查 \(\max\) 。
“猫树这个名字就很茶。猫树是什么东西呢,就是在搞笑;这这这不就简单分治嘛。” —— \(\sf lxl\)
对查询的 \(L\) 那一维分治(猫树),这应当可称为经典了。往两边 “扫描面”(\(\textrm{scanline}\to\textrm{scanplane}\))后变为矩形加、单点查历史最大。只能搬出 \(\text{kd-tree}\) 。
分治区间被修改完全覆盖时,需要直接完成修改。此后需要切换查询点怎么办呢?注意到修改的矩形的两维实际上是 \((-\infty,i_m]\) 和 \([i_m,+\infty)\),对单点有贡献的修改就是一个区间。用线段树就可以查询。
因此,除去 \(\mathcal O(\sum m\log n)\) 的线段树修改复杂度,每层的复杂度是 \(\mathcal O(q\log n+q\log q+m\sqrt{q})\),其中 \(q\) 是询问次数、\(m\) 是修改次数。因为 \(\sum m=\mathcal O(n\log n)\),\(\sum q=\mathcal O(n)\),在每层的 \(m=n,\;q=\frac{n}{\log n}\) 时有最劣复杂度 \(\mathcal O(n\sqrt{n\log n})\) 。
“欸,我这个复杂度是不是算错了啊?” —— \(\textsf{lxl}\)
《洛谷 P6072 Path》
\(\log^2\) 做法平凡。因为它没有用到任何性质,只是单纯算答案。
考虑有没有必然不优的解,减小判断量。首先记 \(v_x\) 为 \(x\) 到根的路径的边权异或和。枚举分界点 \(p\),答案是 \(p\) 子树内最大异或点对 \(+\) \(p\) 子树外最大异或点对。
找出 全局最大 异或点对 \(a,b\),则 \(p\notin\text{path}(a,\text{root})\cup\text{path}(b,\text{root})\) 的子树外最大异或点对就是 \(a,b\),此时 \(p\) 越高越好,而这样的 \(p\) 的 \(\sum\text{size}(p)=\mathcal O(n)\),因此可以 \(\mathcal O(n\log v)\) 搞。
而 \(p\in\text{path}(a,\text{root})\cup\text{path}(b,\text{root})\) 的 “子树外点对” 可以自上而下 \(\rm dfs\) 加入增量(兄弟子树),“子树内点对” 自然就自下而上加入增量,复杂度亦 \(\mathcal O(n\log v)\) 。
《AGC056B Range Argmax》
数据范围这么小,为啥要线性扫描判断 \(\{x_i\}\) 是否可能成立?
确实,按照下标做不太好搞,所以我们按值域做。找出全局最大值,所有覆盖它的区间都 \(\rm done\) 。两侧独立递归。——当然我们假设了原序列是已知的。
反过来,我们 以判定代计数,让 \(\{x_i\}\) 拥有唯一的 “找最大值” 方案,比如最左的可行位置(一个位置可行 \(\Leftrightarrow\) 覆盖它的区间的 \(x_i\) 相同)。然后递归两侧,显然需先递归左侧,因此合并时无组合数系数。
“最左” 会对左侧有限制:设所有覆盖当前(假定的)最大值的区间覆盖了 \([L,R]\),则下一个 \(\max\) 必须在 \([L,R]\) 内(否则可以先删除)。而且这也是充分的。
然后 \(\tt dp\),记 \(f(l,r,x)\) 为只考虑区间 \([l,r]\),且第一个假定的 \(\max\) 在 \([x,r]\) 中的方案数;记 \(\lambda(l,r,x)\) 为区间 \([l,r]\) 内覆盖了 \(x\) 的区间的左端点最小值。
时间复杂度 \(\mathcal O(n^3)\) 。据称,需注意边界情况的处理。
《AGC040E Prefix Suffix Addition》
考虑 只进行第一种操作 的情况。因为两种操作比较独立,这实际上是考虑某种操作的最终影响(感觉像背包合并)。
\(\rm naive\) 贪心会告诉你,操作次数是 \(\sum[a_i>a_{i+1}]\) 的,又不难证明其是下界。
第二种操作是对称的。枚举第一种操作对每个数的贡献 \(b_i\) 则答案为
移项得 \([b_i-b_{i+1}>0]+[b_i-b_{i+1}>a_i-a_{i+1}]\) 。那么每段 \(b_i\) 对 \(b_{i+1}\) 的贡献至多 \(3\) 段。
观察到 \(\tt dp\) 值关于 \(b_i\) 是 单调不增 的。极差最大 \(\mathcal O(n)\),因此维护等值段可以 \(\mathcal O(n\log n)\) 。
但是认真想想:对于任意方案,调整 \(b_i\) 最多改变两个值。因此 极差 一直不超过 \(2\) 。复杂度 \(\mathcal O(n)\) 。
《CF GYM 102586B Evacuation》
区间边界即假定 \(A_{l-1}=A_{r+1}=+\infty\) 嘛;最坏情况即最初所有人都在同一个地方。
枚举走到哪个边界(哪个边界更近),询问变为 \(\max_{x=l}^{r}f(x,b)\),其中 \(f(x,b)\) 表示最初所有人在 \(x\) 处,可用的边界是 \(b\;(b\notin[l,r])\) 时的代价。
显然 \(f\) 是求不出来的。但我们可以猜它有性质。在单个 \(x\) 的维度上,其实没啥性质(我猜它单峰,然后假爆)。那就二维的性质——平行四边形不等式!
Proof. 以 \(f(x,r)\;(r\geqslant x)\) 为例。列差值好算,\(f(x,r{+}1)\) 和 \(f(x,r)\) 的区别就是,一些人原本只移动 \((r{-}x)\) 步到 \(r\),现在需移动到 \((r{+}1)\) 。这个人数就是 \(S-\sum_{i=2x-r}^{r}A_i\),如果它是非负的话。
当 \(x\) 增大时,求和范围的左端点 \((2x{-}r)\) 变小,因此差值更大,即 \(f(x{+}1,r{+}1)-f(x{+}1,r)\geqslant f(x,r{+}1)-f(x,r)\) 。\(\blacksquare\)
对了,我们能不能算某个 \(f(x,r)\) 呢?只需预处理出 \(f(x,n{+}1)\),询问 \(f(x,r)\) 时 \(\mathcal O(1)\) 的调整过去。要点在于求出两边 “装满” 了多少个,可以平衡树上二分。维护 \(i\cdot A_i\) 前缀和,就可知 “装满” 部分的代价。两个边界特殊求即可。(按:或许有更好的预处理方式?这只是我随便口胡的做法,请勿轻信。)因此我们此后是 \(\mathcal O(1)\) 查询 \(f(x,r)\) 的。
然而 \(x\) 范围受限。能否挑出 \(x\) 范围的共同点?也就是做区间拆分。线段树上挂询问。最后每个节点做一次 “决策单调性”(类似整体二分),区间长度为 \(L\) 询问个数为 \(P\) 时复杂度为 \(\mathcal O(L\log P+P\log P)\),可见总复杂度为 \(\mathcal O(n\log n\log q+q\log n\log q)\) 。
如果这篇文章对你有帮助,那么作者是:OneInDark,原文在:https://www.cnblogs.com/OneInDark/p/16421472.html,否则我也不知道这是谁的文章。