【洛谷5377】[THUPC2019] 鸽鸽的分割(平面图欧拉公式)

点此看题面

  • 给定一个圆,在上面选择(n)个点两两用线段相连,求最多能把蛋糕分成多少块。
  • 数据组数(le20,nle64)

平面图欧拉公式

首先给出结论:

[F+V=E+2 ]

其中(F)为分成平面数(包含外部平面),(V)为顶点数,(E)为边数。

考虑证明,我们任选出图中一棵生成树,边数为(V-1)

然后我们构建该图的对偶图,不算生成树中的边。

由于我们选出的是生成树,肯定不会有平面被完全包围住,因此对偶图上所有点连通。而由于我们能选出一棵生成树,则对偶图中也不会有环,因此对偶图也是一棵生成树,边数为(F-1)

因为原图和对偶图中的边加在一起就是所有边,因此((V-1)+(F-1)=E),即(V+F=E+2)

在此题的应用

对于(V),在圆上本来就有(n)个点,而任意四点之间会产生一个交点(交点个数为(C_n^4))。因此(V=n+C_n^4)

对于(E),在圆上本来就有(n)段圆弧,而任意两点之间会产生一条线段(初始线段个数为(C_n^2)),一个交点会把两条线段分成四条新增两条线段(新增线段个数为(2C_n^4))。因此(E=n+C_n^2+2C_n^4)

所以,综上(F=E+2-V-1)(最后的减(1)是要减去外部平面),化简得到(1+C_n^2+C_n^4)

代码:(O(T))

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n;
int main()
{
	W(~scanf("%d",&n)) printf("%d
",1+n*(n-1)/2+n*(n-1)*(n-2)*(n-3)/24);return 0;//平面图欧拉公式
}
败得义无反顾,弱得一无是处
原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5377.html