CF Hello 2020 E.New Year and Castle Construction

Posted 1625--h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF Hello 2020 E.New Year and Castle Construction相关的知识,希望对你有一定的参考价值。

E.New Year and Castle Construction

题意

给定n个点,对于每个点(p),求出4-point 子集(该子集有四个点,并且围成的圈包含(p))的个数

数据给的点中没有三点共线的情况

这个题的题意并不是很好理解,补题过后还发现自己理解的题解是有问题的。

分析

  1. 四个点围成一个圈,第5个点在其中。所以总方案数为(n*C_{n-1}^4),枚举中间那个点,然后从剩余的(n-1)个点中选剩余的四个点。

  2. 考虑(n^2)的做法,正向枚举所有方案中可行的方案并不是很合适,因为要考虑更大的子集的情况,所以反向枚举。

  3. 不合法的方案:其他的四个点并不能包含点(p)。枚举这四个点中的其中一个点(q),计算取剩余3个点的方案数。考虑(p)(q)连成的直线,可以从这条直线某一侧取出三个点,可以发现这样的组合一定不会使得四个点构成的圈包含(p)

  4. 如何不重不漏的删除所有不合法的方案?对于每个(p)(q)作为四个点中,与(p)连线斜率最小的那个点,然后在这样的基础上,只能从(pq)连线一侧拿另外三个点。可以想到这样的方案对于(p)来讲是没有重复的。而(p)的枚举又是独立的,所以可以补充不漏的删除所有方案。

const int N = 3005;
long double x[N],y[N];
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin >> x[i] >> y[i];
    }    
    ll res = 1ll * n * (n-1) * (n-2) * (n-3) * (n-4) / 24;
    long double pi = acos(-1.0L);
    for(int i=1;i<=n;i++){
        vector<long double> v;
        for(int j=1;j<=n;j++){
            if(i == j)continue;
            v.push_back(atan2(y[j]-y[i],x[j]-x[i]));
        }
        sort(v.begin(),v.end());
        int m = n-1,index = 0;
        for(int j=0;j<m;j++){
            while(index < j + m){
                long double ang = v[index%m] - v[j];
                if(ang < 0) ang += 2 * pi;
                if(ang < pi)index ++;
                else break;
            }
            ll cnt = index - j - 1;
            res -= 1ll * cnt * (cnt - 1) * (cnt - 2) / 6;
        }
    }
    cout << res << endl;
    return 0;
}

参考链接

B站up主:https://www.bilibili.com/video/av82161298?p=411

ps:题解有些许啰嗦,up主视频中讲解的很清楚,然后我对这个解法的正确性进行了一些额外的思考,表达能力欠佳,如果读者发现描述中有不准确或者不理解的地方,烦请在下面留言,谢谢!在最后非常感谢B站up主qscqesze的讲解。

以上是关于CF Hello 2020 E.New Year and Castle Construction的主要内容,如果未能解决你的问题,请参考以下文章

CF620E--New Year Tree(线段树)

CF Hello2020 D. New Year and Conference

Codeforces 750 E New Year and Old Subsequence

Good Bye 2014 E - New Year Domino 单调栈+倍增

Hello 2020 A.New Year and Naming

codeforces 140E.New Year Garland