zoukankan      html  css  js  c++  java
  • 【洛谷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;//平面图欧拉公式
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5377.html
Copyright © 2011-2022 走看看