CF193D

讲个笑话:tzc 告诉我 hb 给他们讲了 193B(*2000),我看成了 193D(*2900),然后还真自己做出来了(


首先有一个平方(或者带 log)级别的暴力:枚举组成的等差数列的左右端点,然后判是否可行。很有优化前途。

我们考虑一个套路的扫描线:枚举右端点,维护关于左端点的可行性序列。

考虑一对左右端点可行的充要条件。显然有,当且仅当它们组成 (leq 2) 个区间(连通块)。于是我们考虑维护关于左端点的连通块数量序列。考虑新加进一个 (r) 会让 (l) 们对应的连通块数量获得哪些变化。

这个其实不难。先考虑把 (r) 令为一个单独的连通块整体 (+1)。然后考虑合并,显然对左边和右边能合并当且仅当它被 ([l,r-1]) 包含。那么合并 (0,1,2) 显然分别是区间。

那么问题就转化为了区间 (pm 1),区间数 (1,2)。这个东西我见过不止一遍了(最初的思路来自 rng,然而现在他 goodbye 了),所以秒掉了:考虑线段树的每个节点维护最小值、最小值出现次数、次小值、次小值出现次数,那么显然可上传可懒标记。查询的时候,由于如果有 (1,2) 的话那么它们必定是最小值或者次小值,直接查就可以了。

所以说 *2900 应该是因为远古场的原因。但是有个细节:合并的时候有可能出现左儿子的次小值小于右儿子的最小值,分类讨论出错了,可以直接放进数组大力 sort。调死爷辣!

code

原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-cf193d.html