QOJ 1838.Intellectual Implementation 解题报告
QOJ 1838.Intellectual Implementation
太困难了,深深的感到自己的弱小。
首先两两不交实在是太猎奇了,肯定没法直接做,容斥一下:
两两不交 \(=\) \(\dbinom{n}{3}\) \(-\)【\(A\) 与 \(B\) 有交,两者与 \(C\) 无交】(\(c_1\)) \(-\) 【\(A\) 与 \(B\)、\(B\) 与 \(C\) 有交,\(A\) 与 \(B\) 无交】(\(c_2\)) \(-\)【\(A,B,C\) 间两两有交】(\(c_3\))。
分别对应一下三种形态:

看着不舒服,我们图论建模一下,若 \(u,v\) 有交则连边 \((u,v)\)。考虑令 \(u\) 的度数为 \(deg_u\)。如果我们直接尝试对 \(c_1\) 计数,总连边数量就是 \(\frac{\sum deg_i}{2}\),再随便选一个点则是 \(S_1=\frac{\sum deg_i}{2}(n-2)\),考虑这个东西的意义,其很明显会算重,具体的,结合上图我们有 \(S_1=c_1+2c_2+3c_3\)。再考虑对 \(c_2\) 计数,枚举中间的 \(B\) 点对 \(A,C\) 计数,可以得到表达式 \(S_2=\sum \binom{deg_i}{2}\),同理有 \(S_2=c_2+3c_3\)。由此我们可以通过 \(S_1-S_2=c_1+c_2\) 得到 \(c_1+c_2\),因此我们只需要知道 \(d_i\) 和 \(c_3\),即可得到
首先考虑 \(deg_i\) 怎么求。考虑扫描线,在 \(x\) 轴上(即按照 \(l,r\))扫描线,假设我们要考虑 \(j\) 对 \(deg_i\) 的贡献,首先要要求在 \(y\) 轴上(即按照 \(d,u\))两个矩形有交,即要有 \([d_j,u_j]\cap [d_i,u_i]\ne \varnothing\),求相交区间个数的部分有一个trick,考虑将相交个数表示成 \(\sum [l_i\le R]-[r_i<L]\),那么直接对 \(l\) 和 \(r\) 分别维护一个树状数组即可支持加入线段、删除线段、查询相交个数。
接着我们可以对与 \(i\) 相交的矩形分类:
-
对于 \(l_i\in [l_j,r_j]\) 的部分,在 \(l_j\) 加入 \([d_j,u_j]\),\(r_j+1\) 删除 \([d_j,u_j]\),对于贡献可以在 \(l_i\) 加入时求与目前线段的交的个数。
-
对于 \(l_j\in [l_i,r_i]\) 的部分,考虑差分思想,我们在 \(l_j\) 加入 \([d_j,u_j]\) 后,我们不在后面删除这条线段,用 \(e\) 表示扫到 \(l_i\) 时的交个数,\(e^\prime\) 表示扫到 \(r_i\) 时的交个数,则 \(e^\prime-e\) 就是交的个数,因为这个个数相当于在 \([l_i,r_i]\) 中新加入的合法线段个数。
因此我们可以通过两次扫描线求出 \(deg_i\)。接下来考虑求出 \(c_3\)。
前置知识:网格图容斥,其本质思想其实是点边容斥和网格图结构的结合,内容是对于一个 \(n\times m\) 的网格图矩形,可以观察到有等式:\(nm-(n-1)m-n(m-1)+(n-1)(m-1)=1\)。
对于一块被 \(k\) 个矩形同时覆盖的区域,其对 \(c_3\) 的贡献为 \(\binom{k}{3}\),我们借鉴一下网格图容斥的思想:

其可以看作先对黑色部分 \(+1\),然后对红色部分 \(-1\),再对绿色部分 \(-1\),再对蓝色部分 \(+1\),最后可以使得这个矩形被贡献恰好 \(1\)。
因此我们可以做四次偏移,分别将上边界和右边界偏移 \((0,0),(0,-1),(-1,0),(-1,-1)\),然后跑扫描线,我们需要支持的是维护一个数组 \(v\),支持区间 \(v_i\) 加减、查 \(\binom{v_i}{3}\) 的和,看似很困难,但是注意到我们有范德蒙德卷积:
因此我们维护 \(1,\binom{v_i}{1},\binom{v_i}{2},\binom{v_i}{3}\) 即可通过范德蒙德卷积实现打 \(\mathrm{tag}\)。
于是我们可以求出 \(c_3\),带入原来的公式,所有问题都得到了解决。
时间复杂度应该是 \(O(n\log n)\) 带超级大常数。 submission

浙公网安备 33010602011771号