AT_joisc2012_constellation 星座

发布时间 2023-11-01 09:58:34作者: zackzhm

题目传送门
更好看的题面
非常巧妙的凸包。

题目分析

这道题的本质就是将所有点划分为两个生成树,求可能的方案数。

part 1 求凸包的答案

我们可以考虑先求一个整体的凸包,如下图:
图1:凸包
其中红色的点为星座 $A$,蓝色的点为星座 $B$,黑色的点不确定。
先考虑凸包上的点,对于凸包上的点,当存在红蓝红蓝两组相间的情况时一定无解,因为他们无法通过内部连接,也无法通过凸包上连接。如下所示:

外部无法连接。

内部同样无法连接。
而其他情况都是有解的。(可以自行画一下)
然后我们来考虑怎么求答案,发现只有没相间和有一个相间的情况,开始分类讨论:

  1. 当没有相间时,对于凸包上的被夹在确定星座中间不确定星座的点,设他们的个数为 $d$,我们发现他们的贡献是 $\frac{d \times (d + 1)}{2}$。
    配个图各位可以自己推以下:
  2. 当有一个相间时,对于凸包上被夹在确定的不同的星座中间的点,设他们的个数为 $d$,我们发现他们的贡献是 $d + 1$。这里不能创造交叉的情况,所以贡献是这个。
    同样配个图感受以下:

part 2 求内部答案

凸包上的情况讨论完后,我们就可以来讨论内部的情况了。
先说结论:无论怎么安排,内部都不会有影响。
其实感性理解就是我们总可以给内部的点留出一线生机连到凸包上。
理想的证明就是可以随便找一个点作为中心,然后将凸包上的点连上它,就可以划分出多个三角形。
如果凸包上的点星座不同不用讨论,在上面求凸包时讨论过了,有解,如果三角形三个点星座相同肯定符合情况有解,如果三角形凸包上的点和内部的点不同再讨论一下。
如果内部有点可以再将一个三角形划分为三个三角形,有点就重复再划分,如果里面没有点了,可以发现是可以分开的,有解,如果三个点颜色相同就同上直接结束。
我的评价是:不如画图感性理解。
给个图大家画着玩玩吧。

于是我们就可以发现对于每一个不确定的点把答案乘 $2$ 就行。
注意只有一种星座的要减一。

code

代码