1284E

Posted 19992147orz

tags:

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

计算几何

先枚举被围住的点 计算合法比较困难 考虑计算不合法方案数 

枚举其他点 选一个点连线作为基准边 当其他三个点连线都在基准边的一侧时不合法 极角排序+双指针统计即可

时间复杂度$O(n^{2}logn)$

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5005;
int n;
int x[maxn], y[maxn];
struct Vec {
    int x, y;
    Vec() = default;
    Vec(int _x, int _y) : x(_x), y(_y) {}
    ll friend operator ^ (const Vec &a, const Vec &b) {
        return 1LL * a.x * b.y - 1LL * a.y * b.x;
    }
    bool friend operator < (const Vec &a, const Vec &b) {
        if(1LL * a.y * b.y < 0) {
            return a.y > b.y;
        }
        return (a ^ b) > 0;
    }
} st[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
         scanf("%d%d", &x[i], &y[i]);
    }
    ll ans = 0;
    for(int i = 1; i <= n; ++i) {
        int top = 0;
        for(int j = 1; j <= n; ++j) {
            if(j != i) {
                st[++top] = Vec(x[j] - x[i], y[j] - y[i]);
            }
        }
        sort(st + 1, st + top + 1);
        for(int j = 1; j < n; ++j) {
            st[++top] = st[j];
        }
        int pos = 1;
        for(int j = 1; j < n; ++j) {
            pos = max(pos, j);
            while(pos + 1 <= top && (st[j] ^ st[pos + 1]) > 0) {
                ++pos;
            }
            ll c = pos - j;
            ans += c * (c - 1) * (c - 2) / 6LL;
        }
    }
    printf("%lld
", 1LL * n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 24LL - ans);
    return 0;
}
View Code

 

以上是关于1284E的主要内容,如果未能解决你的问题,请参考以下文章

CF1284E New Year and Castle Construction

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板