绍一的模拟赛题
题意:
小Z养了$??$只企鹅,第$i$只企鹅的坐标为$(x_i, y_i)$,颜色为$??_??$。出于对企鹅安全的考虑,他决定造栅栏。地面上有$??$个桩,编号$0...?? − 1$,小Z会用一些直的栅栏,每个栅栏连接某两个桩子。对于最后的结果,任意两个栅栏不能交叉。任意一个桩只能连接0个或2个栅栏,栅栏必须围成一些封闭的多边形。由于经费有限,每一个多边形内至少包含一只企鹅。小Z的企鹅有着许多颜色。相同颜色的企鹅必须在同一个多边形内。为了保证所有企鹅的安全,每一只企鹅都必须被包含在某一个多边形内。
各种不合法的情况:
某种合法的情况:
现在小Z想知道自己有多少种合法的不同的造栅栏的方案??????。
【题解】
用?[??][??][0..1]表示??, ??必须选,点的编号在??, ??之间,最外层的多边形内没有(0)或有(1)企鹅的除了最外层多边形其他多边形均合法的方案数。??[??][??]表示??必须选,点的编号在??, ??之间合法的方案数。??[??][??]表示,点的编号在??, ??之间合法的方案数。当一个栅栏两侧没有相同颜色的企鹅时定义这
个栅栏是有效的。
然后就可以直接区间DP了。考虑计算?[??][??][??????],枚举中间点????,当< ????, ?? >合法时进行转移,分类讨论??????和三角形(??, ????, ??)中有没有点的情况,再考虑向量< ??, ???? >右侧有没有企鹅,没有直接转移,有的话,考虑多边形(??, ?? + 1, ???? − 1, ????)内有没有点分类讨论一下即可。考虑计算??[??][??],枚举中间点????,当< ????, ?? >合法时进行转移,如果向量< ??, ?? >左侧和向量< ??, ???? >左侧的企鹅的并集为空??[??][??]+ = ?[??][????][1],否则如果向量< ???? + 1, ?? >的企鹅和上面两个的并集为空??[??][??]+ =?[??][????][1] * ??[???? + 1][??]。??[??][??]可以轻松的从??[??][??]转移过来。
【分析】
题解非常地神,直接给出了一个dp,这里从头分析为什么要这么做。
首先很容易确定一条边是否可以选(如果这条边两侧有相同颜色的企鹅,那么不能选)
那么现在问题变成了知道一些边能选不能选,要求选择一些边使得它们围成多个多边形,且每个企鹅都在一个多边形里,每个多边形里都有至少一个企鹅。
问题是在一个环上选出一些边,怎么就变成区间dp了呢?
考虑最朴素的暴力:枚举每条边选不选,再检查是否满足条件。所以第一步,我们考虑枚举一条边,选择任意一个点作为起始点,如下图选择了这个绿色的点
为了不重复,我们枚举这个点沿逆时针方向遇到的第一个有边的点。具体地说,这个点可能有边,可能没有边,如果没有边,我们按逆时针顺序继续枚举下一个点,直到枚举到一个有边的点,标为蓝色。
接下来继续枚举第二的点作为边的另一端,我们现在找到了一条边<i,j>,由于i是从l开始第一个有边的点,所以[l,i+1]里面的点都不会再有边了,而[j+1,r]里点只有它们内部才可能有边。这就剩下可能有边的点恰好是一个区间,所以可以考虑区间dp。我们现在关心的是什么?是[i,j]这段区间里,能形成多少种如红线的方案,具体来说就是选了某些边,且i,j都已经作为一个端点,这样就可以 在添加了(i,j)之后合并了,记方案数为h(i,j)(暂时不企鹅的限制),那么此时答案需要加上h(i,j)*([j+1,r]里连边的方案数)。
再来看[j+1,r]里连边的方案数怎么求,我们发现这又是可以看成一个环,我们又回到了一个和原来的问题一样的问题,可以用同样的方式求解,不妨用f(l,r)表示,这样答案就是f(0,n-1)。
现在我们考虑h(l,r)怎么求,同样的,我们可以枚举l出去的第一条边<l,i>