• 【洛谷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;//平面图欧拉公式
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    位运算
    (二)给Centos配置网络以及使用xshell远程连接Centos
    (一)安装Linux时的磁盘划分
    (五)多点触控之兼容ViewPager
    (四)双击放大与缩小图片
    (三)多点触控之自由移动缩放后的图片
    (二)弥补图片自由缩放出现的间隙
    (一)自定义ImageView,初步实现多点触控、自由缩放
    (四)实现菜单点击弹出提示框
    (三)实现菜单点击动画
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5377.html
Copyright © 2020-2023  润新知