• ConvexScore


    题目描述

    You are given N points (xi,yi) located on a two-dimensional plane. Consider a subset S of the N points that forms a convex polygon. Here, we say a set of points S forms a convex polygon when there exists a convex polygon with a positive area that has the same set of vertices as S. All the interior angles of the polygon must be strictly less than 180°.
    For example, in the figure above, {A,C,E} and {B,D,E} form convex polygons; {A,C,D,E}, {A,B,C,E}, {A,B,C}, {D,E} and {} do not.
    For a given set S, let n be the number of the points among the N points that are inside the convex hull of S (including the boundary and vertices). Then, we will define the score of S as 2n−|S|.
    Compute the scores of all possible sets S that form convex polygons, and find the sum of all those scores.
    However, since the sum can be extremely large, print the sum modulo 998244353.

    Constraints
    1≤N≤200
    0≤xi,yi<104(1≤i≤N)
    If i≠j, xi≠xj or yi≠yj.
    xi and yi are integers.

    输入

    The input is given from Standard Input in the following format:
    N
    x1 y1
    x2 y2
    :
    xN yN

    输出

    Print the sum of all the scores modulo 998244353.

    样例输入

    4
    0 0
    0 1
    1 0
    1 1

    样例输出

    5

    提示

    We have five possible sets as S, four sets that form triangles and one set that forms a square. Each of them has a score of 20=1, so the answer is 5.

    题意:
    平面上有n(n<=200)个点,对于其中能够构成凸多边形的点集S,计算一个得分score,并输出所有这样能构成凸多边形的点集的得分之和。
    score=2^(n-|S|), n: 构成此凸多边形的点数及其内部的点数总和;|S|: 构成此凸多边形的点数。
    
    那么就是要对所有的凸包,求其内部的点数所构成的集合个数。
    发现太难求了,总不能枚举所有的凸包啊……
    所以我们就从反面来求,求所有点构成的集合个数-不能构成凸包的集合个数
    什么样的点不能构成集合? 单点或共线
    所以就枚举所有直线就好了
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=250;
    const int p=998244353;
    int n;
    struct orz{
        int x,y;}a[N];
    ll ans;
    ll poww(ll x,ll y)
    {
        ll ret=1;
        while(y)
        {
            if (y&1) ret=ret*x%p;
            x=x*x%p;
            y>>=1;
        }
        return ret;
    }
    bool check(int a,int b,int c,int d)
    {
        if (a*d==b*c) return 1;
        else return 0;
    }
    void solve()
    {
        for (int i=1;i<=n;i++)
        {
            for (int j=i+1;j<=n;j++)
            {
                int cnt=0;
                for (int k=j+1;k<=n;k++)
                    if (check(a[i].x-a[j].x,a[j].x-a[k].x,a[i].y-a[j].y,a[j].y-a[k].y)) cnt++;
                ans=(ans-poww(2,cnt)+p)%p;
     
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
        ans=poww(2,n);
        ans=(ans-1-n+p)%p;
     
        solve();
        printf("%lld
    ",ans%p);
        return 0;
    }
    View Code
  • 相关阅读:
    vue-awesome-swiper-T 轮播图
    transition-T 手机端滑动验证
    VUE-T
    跨域配置-Access-Control-Allow-Origin
    HTML中CSS引入图片并铺满背景
    mysql_affected_rows()、mysql_fetch_row、mysql_fetch_assoc
    tp框架的四种路由方式
    sql注入
    禁用cookie,怎么获得session
    git解决冲突的方法
  • 原文地址:https://www.cnblogs.com/tetew/p/9454614.html
Copyright © 2020-2023  润新知