题目大意:
n颗星星,坐标(xi,yi)(x_ i,y_ i),每个点是A,B两个非空点集合中的一个点
给出长度为n的序列C,第i位为1代表第i颗星星是A集合的,为2代表是B集合的,为0代表不确定。
对于每一种合法的划分,你都可以加一些线段,线段两个点所属集合相同,每个集合中的点通过这些线段实现联通,且A集合的线段不与B集合的线段相交
求合法的划分数,模109+710^ 9+7
数据保证没有三点共线。

真的不知道怎么想到题解这种做法。。。
考虑什么情况可以做到。把属于A看成白色,属于B看成黑色。
连实边表示在图上出现了,虚边表示结构分割(因为要考虑子问题)
现在先对这些点求一个凸包。
先假设凸包是一个三角形。
假如三个顶点颜色不同(考虑一黑两白):
首先两个白点连边。

  • 假如说三角形里面全是白色乱连即可。
  • 否则可以选出一个黑色的点出来,向黑色顶点连边,并把这个大的三角形从这个点分开,看成三个黑白都有的小三角形。递归操作。

假如三个顶点颜色相同(考虑全白):
首先三个白点相互连边。

  • 假如说三角形里面全是白色乱连即可。
  • 否则可以选出一个黑色的点出来,把这个大的三角形从这个点分开,看成三个黑白都有的小三角形。递归操作。

三个顶点颜色相同的情况(里面没法连接外面)显然只会在最外层出现
而一黑两白时每一个点都连到了它所属的最小三角形的顶点上,所以总是连通的。

好,但是凸包现在不是三角形,怎么办?
会发现凸包假如按颜色分段的话,最多只能有两段。
必要性:大于两段的话任意一种颜色都必须经过多边形内部相连。显然无法避免交叉。
充分性:
假如说多边形由两段构成,那么总有方法用顶点三角形划分多边形,使得每个三角形上都有两种颜色出现。
那样的话里面的每个点都会连到凸包上,总是合法的。
假如说多边形只有一段呢(假设全白)?

  • 里面全白就乱连
  • 否则找到一个黑点,从这个黑点向所有顶点连虚边来把多边形划分成若干个三角形。

综上,划分合法当且仅当只要凸包按颜色分段时段数小于两段。。。