[TCO2014 3B]OnePointNineNine

版权声明:本文是蒟蒻写出来的,神犇转载也要说一声哦! https://blog.csdn.net/WerKeyTom_FTD/article/details/79910635

题目大意

现在平面上有n个点,已知有一个常数D。
任意两点的距离要么<=D,要么>=1.99D。
请问有多少点集的子集,满足任意两点距离>=1.99D。

n<=1000。

解法

我们肯定是把距离<=D的点对连边。然后相当于独立集计数。
可以考虑把等价点缩在一起:
两个点如果它们之间有连边,然后其余连边完全相同,则显然该两点等价。
即{u}or{u的邻居}={v}or{v的邻居}
接下来有一个结论:
缩完点后每个联通块都是环或链(即每个点度数不超过2)。
那么对每个联通块DP即可。
如何证明结论?

证明

首先,如果对于两个点u和v,|uv|<0.99D,它们一定等价。
因为这两个点一定有连边,然后对于一个其他点w,如果u与w有边,则|uw|<=D,根据不等式|vw|<=|vu|+|uw|<1.99D,因此v与w也一定会有边。
那么,缩点后的图,每条边的长度均在[099D,D]。
接下来我们来反证不会出现度数为3的点。
假设一个点连接了三个邻居。
任意两个邻居间距离要么<=D,要么>=1.99D。
每个邻居距离该点都在[0.99D,D]间。
不妨用余弦定理解出角度的范围。
如果两个邻居距离>=1.99D,那么角度范围在180度往下一点。
如果两个邻居距离<=D,那么角度范围在60度左右。
如果没有邻居间有边,加起来下界爆了360度。
如果有一对有边,也爆了360度。
两对有边达不到360度,三对有边同理。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页