有点营养的题。
很容易做三条竖线,接下来考虑两竖一横。直接枚举横线会变成支持加入区间删除区间维护有多少种方案选择两个点使得任何区间至少包含其一。当然一个想法是线段树分治,以一只 log 的代价转化为只有加入,这个先放着。胡乱离散化一下,又可以转化为点带权但值域只有 \(2n\)。当然这样会存在线段相同的问题,但是可以通过容斥解决掉。
考虑枚举左侧点算有多少合法的右侧点,首先如果有区间完全在左侧点的左边直接不合法,其次如果右边有俩不交区间那么也不合法。满足这俩的合法左侧点构成一个“左侧点区间”,这是很好求的。考虑其中的某个特定左侧点,发现此时所有合法右侧点也构成一个“右侧点区间”,且“右侧点区间”的左端点是始终不变的——左端点最右的区间的左端点。于是你只需要对于所有左侧点维护【它的“右侧点区间”的右端点】的区间和。考虑当你加入一个区间的时候这个东西会怎么变化,容易发现是前缀取 min。一个朴素想法是 Segment Tree Beats!
,可惜它不支持撤销,不能套线段树分治,所以我们需要一个更厉害的东西。考虑单侧递归线段树。具体地,这里是支持单点修改,维护后缀 min 的区间和。我们发现它可以随便支持删除——对每个位置维护俩堆即可。于是我们不需要线段树分治。时间复杂度是 \(\Theta(n\log^2 n)\)。