线下春眠做噩梦

牢骚:完蛋了,每天都欠一屁股债,那么多题没补,我要爆炸了!😭

以及,我讨厌 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\) 的区间的左端点最小值。

\[f(l,r,x)=f(l,r,x{+}1)+f(l,x{-}1,\lambda(l,r,x))\cdot f(x{+}1,r,x{+}1) \]

时间复杂度 \(\mathcal O(n^3)\) 。据称,需注意边界情况的处理。


《AGC040E Prefix Suffix Addition》

考虑 只进行第一种操作 的情况。因为两种操作比较独立,这实际上是考虑某种操作的最终影响(感觉像背包合并)。

\(\rm naive\) 贪心会告诉你,操作次数是 \(\sum[a_i>a_{i+1}]\) 的,又不难证明其是下界。

第二种操作是对称的。枚举第一种操作对每个数的贡献 \(b_i\) 则答案为

\[\sum_{i=1}^{n-1}[b_i>b_{i+1}]+[a_i-b_i<a_{i+1}-b_{i+1}] \]

移项得 \([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)\)

posted @ 2022-06-28 22:28  OneInDark  阅读(109)  评论(6编辑  收藏  举报