很妙的一道计数题
思路
首先可以明确如果枚举每种连边情况 暴力计算连通块时间复杂度是不可接受的
(题目中%1e9+7 不就表明了这一点)
因此考虑计算每一种连通块的总出现次数 即对答案的贡献
(“因此” 好难想)
性质:
- 如果设 (l1,r1),(l2,r2)分别为两条连边且 l1<r1,l2<r2
若 l1<=l2<r2<=r2则两条直线必不相交 l1<r1<=l1<=r2时也必不相交
那么仅有交叉关系时相交 因此 给定一条线段的两个端点 我们能判定他们的相交关系
- 我们来分析连通块
此时 l1,l2,r1,r2同属一个连通块
此时 l1,l2,r1,r2同属一个连通块而 l3,r3属于另一个连通块
同时两个连通块不同当且仅当至少有一个点出现在其中一块中而不存在另一块中
因此一个连通块最左的点和最右的点可以表示一个连通块
用人话说就是
令 l1,r1为连通块 A 最左侧和右侧的点;
l2,r2为连通块 B 最左侧和右侧的点
若 l1≠l2或 r1≠r2则连通块 A≠B
从性质出发的做法
令 fi,j表示以 i,j为左右端点的连通块的贡献次数
显然只要区间 (i,j)里头的东西不要往区间外连 那么随意连都是合法的
令 cnti,j表示 (i,j)里还有多少点可以随意连
gi表示 i个点的连线总方案
即有 fi,j=gcnti,j−∑fi,k∗gcntk+1,j
然后 O(n3)搞定(
3 条评论
Qiuly · 2021年10月31日 8:34 下午
图是不是挂了 /kk
Hencecho · 2021年11月2日 3:28 下午
好像是的()
洛谷图床容易出锅/kk
Qiuly · 2021年11月9日 6:55 下午
还是看不了 /kk