洛谷博客杂题 #1
P5979 [PA2014] Druzyny
考虑 \(\max\) 根笛卡尔树上启发式合并。
我们知道方程是
然后我们知道 \(\min\) 是方便维护的,可以使用两遍扫描线求出 \(i\) 在左边还是右边的情况。
考虑这个东西既然跨过了笛卡尔树的根节点,那么就可以算出另一端的贡献区间。
然后就是经典的对另一端区间取 \(\max\),并加方案数。这个可以线段树维护。
Uoj#637. 【美团杯2021】A. 数据结构
考虑正难则反。
然后就相当于求有多少个颜色不出现在 \([l, r]\) 里面。相当于 \(\forall ocur_c \in [l, r], \forall ocur_{c - 1} \not\in [l, r]\)。
这个就是小清新扫描线了。
手玩若干年发现,当一个颜色不合法当且仅当 \(l \in (pre_{c_i - 1}, st_{c_i}]\),然而相反的,如果没有 \(c_i\) 但是有 \(c_{i} - 1\),还得加上这个颜色。
总之就是很有趣。
不难使用树状数组维护。
「JOISC2019」 两个天线
我的做法好笨。
考虑绝对值拆掉,然后对于两种情况取个 \(\max\)。
考虑用 \(inf\) 来描述有几个可以配对的端点。
然后我们考虑前面的一个 \(j\),我们右端扫描线,并用线段树维护左端点,然后就是经典的一加一删。
然后我们对于右端点的东西直接使用历史最大值,感觉有点大炮轰蚊子.jpg。
似乎是最劣的 \(O(n \log n)\) ,好像还跑不过 \(O(n \log^2 n)\) 的线段树分治。
CF1028F
2900?1900!!
考虑定义就知道要到 \((0, 0)\) 的距离相同,然后这个又是格点,所以对于定长的点对个数很少。
最多大概只有 \(V = 144\) 个?好像是的。
然后我们插入删除直接模拟,枚举距离相同的点,只需要求出对应的斜率即可。
具体来说我们考虑两个点对的中点就在那条对称轴上,也就是说我们对 \((x_1 + x_2, y_1 + y_2)\) 的极角来维护就好了。
实现使用了 map 套 set。
时间复杂度大概是 \(O(Vq \log n)\) 属于是比较 dirty work 了。
实际上远远跑不满。
CF639F Bear and Chemistry
考虑对于原来的无向图缩一个边双,然后就相当于边双之间连边,在新图上询问那些原来的标记的边双是否在一个边双里面。
但是暴力边双连边会爆,所以就是很平凡的虚树,我们对于这些边双建虚树,让后再连边,再跑边双就可以了。
复杂度 \(O(\sum |V|\log |V| + \sum |E|)\)。
sub:#243907390
P8528 [Ynoi2003] 铃原露露
感觉是 P7880 和 CF997E 拼起来。
因为太像前者了,所以我们先做一边 P7880 的支配点对的理论,发现到了这个题里面变成了:
在右端点扫描线的情况下扫到了一组新的点对,对于点对 \((x, y, z)\) 我们钦定 \(a_x < a_y\) 分类讨论 \(a_z\) 有:
-
\(a_z < a_z < a_y\) :ban 掉 \((a_z, a_x]\) 为左端点的区间
-
\(a_x < a_z < a_y\):没有任何影响
-
\(a_x < a_y < a_z\) :扫到 \(a_y\) 的时候 ban 掉 \([1, x]\) ,扫到 \(a_z\) 取消这个限制。
但是点对个数还是太多??我们发现对于 \([l, r] \subseteq [l', r']\) 的限制,显然后置更优,所以我们对于 \(x\) 就是要求距离更小的 \(y\),就转为 P7880 的前驱后继。
具体来说就是树上启发式合并,对于一定的 LCA,对于每个 \(x\) 求出其前驱后继即可。
我们用 CF1044F 中经典的区间 \(+1\) 来描述 ban 的这一个限制,所以转化为右端点扫描线、区间加、区间历史 0 的个数。
然后根据 tirck 的直觉反射,发现 \(0\) 只会是最小值,再按照 CF997E 的经典维护历史最小值个数就好了。
时间复杂度 \(O(n\log_2^2 n)\),代码算是写的最抽象的一个。

浙公网安备 33010602011771号