[Ynoi2003] 戌亥彗星
这个条件有点不好处理,考虑找一些好处理的性质来做这道题。
首先,大体思路是套路的,我们扫描 \(r\),去更新答案,然后我们考虑维护指针 \(l\),我们首先希望区间子图 \([l,r]\) 有且仅有一个简单环,考虑用 LCT 维护,具体是维护一棵树与一条边,这条边是多出来的边,显然这条边连着的点都在环内。
而我们现在需要增加一条边,若我们加入一条边会产生新的环,我们需要丢掉一些边,也就是让 \(l\) 右移,如果右移到多出来的边,设这条边为 \(rem\),直接让 \(rem\) 等于 \(0\) 即可。否则如果删去 \(E_l\) 时,\(rem\) 可以放入树中,那么我们将其放入并让 \(rem\) 等于 \(0\) 即可。
求出 \(l\) 后,题目要求环以外的点度数都不超过 \(2\),我们可以维护当前拥有的度数超过 \(2\) 的个数和在环内度数超过 \(2\) 的个数,前者直接维护,后者 LCT 维护,由于每删一条边可以使前者减少但不一定使后者减少,所以具有单调性,可以直接移动 \(l\)。
最后题目要求是连通图,然而注意到现在我们只有一个简单环,那么现在其实是要求 \(|V|=|E|\),由于当前区间 \([l,r]\) 内的区间子图肯定满足 \(|V|-|E|\ge 0\),那么肯定只有 \(|V|-|E|=0\) 时的区间可以产生贡献,我们可以维护一棵线段树,每个区间维护 \(|V|-|E|\) 的最小值,在增加贡献时只有最小值为零的区间可以增加。
然后是一些线段树和算贡献的小细节,巨佬可以跳过。由于我们求的是所有区间,所以我们在每个 \(r\) 都增加一次贡献,然后每个询问 \(ql,qr\) 在 \(r=qr\) 时算贡献就行了。
然后就是下传标记的细节。由于我们会先更新最小值再增加贡献,所以标记下传顺序应是最小值在先。还有一些维护方法可以看代码。
时间复杂度 \(\mathcal{O}((n+q)\log n)\)。