是个美难题。
首先这种偶数减计数看着就跟容斥很有关系,总之这种题肯定不太能是分开算。
而这道题一共有两种方法都很有教育意义,一种是容斥,一种是利用一些方法去抵消贡献。
先讲容斥吧。显然我们容斥就是钦定哪些位置一定不选,然后每个区间的贡献就是 \(-1\),一种方案的贡献就是它们的积。不难发现,如果对于一种钦定方案存在一个区间可以选,那选与不选的贡献正负抵消,我们就只用统计没有满足条件的区间的钦定方案数即可,我们可以设计 dp,设 \(f(i)\) 表示前缀 \([1,i]\) 的答案。我们对于一个右端点 \(r\),可以求出最大的 \(l\) 使得区间中包含一个给定区间,设其为 \(p_r\),那么对于 \(f(r)\) 我们有转移方程 \(f(r)=-\sum_{i=p_r}^r f(i-1)\),我们不妨前缀和,设 \(g(i)=\sum_{j=0}^i f(j)\),则 \(g(i)-g(i-1)=g(p_i-2)-g(i-1)\),我们惊奇的发现 \(g(i)=g(p_i-2)\)。
这样对于多组询问我们就可以快速求 \(g(i)\) 的值了,\(f(i)\) 就是 \(g(i)-g(i-1)\)。我们不妨将 \(i\) 向 \(p_i-2\) 连一条边,然后倍增优化去跳,到终点讨论一下答案即可。
通过感受我们可以发现抛开套路不谈最精彩的一步是我们能够发现 \(g(i)=g(p_i-2)\),其本质是因为负数的转移系数可以使得很多项互相抵消所制。
接下来再讲讲这题的主流做法,我的代码写的也是这个。
就是考虑正负抵消,首先我们发现这是要求并起来结果为 \([l,r]\),所以我们可以发现对于一个给定区间如果它包含了某个其它的给定区间,它是无意义的,因为只要选了它就会被正负抵消。
然后我们发现最后的区间序列是关于左右端点分别单调的,这很漂亮,但是仍然不够。
我们从头开始考虑,首先第一个区间必选,第二个区间我们不好说,但是我们发现如果第一个区间和第三个区间的并包含了第二个区间,那第三个区间也是无效的!因为第一个必选,第二个则负责抵消。我们将其变得更加形式化,对于 \(l_3\le r_1\) 的区间我们可以直接删,我们把所有该删的删完,接下来我们发现第二个区间变成了必选区间,那么我们再把第二个区间作为第一个区间去删,最后我们发现剩下的所有区间都是必选的,那么答案就只需要关心区间总数的奇偶性了。
现在考虑做这道题,我们考虑对于区间 \(i\) 往最小的 \(j\) 满足 \(r_i<l_j\) 连边,查询就是找到第一个区间和第二个区间,然后往后倍增知道卡到 \(r\) 位置,我们来分析答案,如果两边倍增完右端点都小于 \(r\) 或者倍增完的区间相同就表示无解,对于后者的意义就是中间存在间隙覆盖不到。否则就是根据奇偶性输出答案了。
我们发现这个做法需要我们要么注意力在线,能够感受到必选和包含带来的伟大力量。要么就抓住关键,利用包含关系和式子的特殊性去正负抵消,最后只需要一个倍增的 trick 即可,看到这种往后跳的问题我们可以考虑倍增。
不过怎么想感觉都是容斥是更自然好想的。希望大家能通过我的题解学到东西,如果觉得写得好可以点个赞!
代码。
