其他算法综合

根号分治

应用技巧:一般多出现于有两个乘积小于等于定值时。一般其中一个根号计算较为简单,另一个根号计算感觉要难一点,还是要积累一下方法

AT_arc160_b [ARC160B] Triple Pair

题面中 \(xy \le n\) 不要被小于等于迷惑,此处依然可以使用根号分治。不过严谨来说不是根号分治,但是还是用这题提醒一下自己看到乘积大约为定值的时候考虑根号。以 $ \sqrt{n}$ 为分界点,\(x\)\(y\) 必定有一个数小于 \(\sqrt{n}\) ,于是不妨设 $x \le y \le z $ ,此时 \(y \le \sqrt{n}\) 于是枚举 \(y\) 再乘法原理计数即可。

P5309 [Ynoi2011] 初始化

修改次数与修改周期乘积 \(\le n\) 。修改次数 $ \le T$ 时候直接暴力修改,修改次数 \(\ge T\) 时候说明每次修改的间隔很短。可以维护每一个修改周期下的修改位置。其实题目本质上就是在 \(mod\) \(x = y\) 的位置上增加值,于是对于每个模数 \(x\) 维护取模后值的前后缀和统计即可。

CF1039D You Are Given a Tree

P3396 哈希冲突

这个维护简单直接维护小于 \(T\) 的模数的池子,大于 \(T\) 的暴力累加即可。

笛卡尔树

应用:可以找数列中的每一个位置作为区间最小值的时候的最大区间。实际应用时可以用单调栈寻找。

反悔贪心

可以看成对于一个错误贪心的修正,使得可以带着反悔/撤回选项。

P3620 [APIO/CTSC2007] 数据备份

我们可以发现对于某一位置 \(i\) 来说,如果 \(d_i<\{d_{i-1},d_{i+1}\}\),那么如果要选就是 \(d_i\) 或者 \(\{d_{i-1},d_{i+1}\}\) 打包选。于是如果选中某一位置,直接再插入一个 \(d_{i-1}+d_{i+1}-d_i\) 的选项即可。

CF865D Buy Low Sell High

这其实有点两两匹配的感觉,若干对二元组 \((i,k)\) 表示在第 \(i\) 天买入,第 \(k\) 天卖出。可是我们可能在 \(i<j<k\) 中的 \(j\) 点就匹配到了 \((i,j)\) 怎么办呢?我们可以加入一个反悔操作,\((i,k)=(i,j)+(j,k)\)。对于每个 \(i\) 我们先看看以堆中最小代价购买,能否通过 \(p_i\) 获利,如果可以就拿出去匹配一下,并加入撤回选项 \(-p_i\),最后要插入一个购买选择选项 \(-p_i\)

posted @ 2024-01-07 00:05  Mirasycle  阅读(8)  评论(0编辑  收藏  举报