首页 > 编程语言 >2024牛客寒假算法基础集训营6 H 纷乱的红线 题解

2024牛客寒假算法基础集训营6 H 纷乱的红线 题解

时间:2024-02-25 15:58:24浏览次数:19  
标签:return Point 题解 LL db da 2024 && 集训营

Question

2024牛客寒假算法基础集训营6 H 纷乱的红线

小红拿到了一个圆,以及平面上有 \(n\) 个点(保证没有三点共线)。现在小红将随机取 \(3\) 个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?

Solution

考虑到 \(n \le 1000\)

可以枚举每一条线,计算这一条线和圆的交点,每条线对答案的贡献是 \((n - 2) \times\) 交点个数

所有三角形的数量是 \(C_n^3\)

有一个细节,如果一个点在圆上的话,会被重复计算,需要把重复的部分减去

也就是对于每个在圆上的点,被计算了\((n - 1)\) 次,每次的贡献是 \((n - 2)\),需要减去的就是 \((n-1)(n -2)/2\)

Code

#include <bits/stdc++.h>
using namespace std;
typedef __int128 LL;

inline LL read() {
    LL x = 0, f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}

void print (LL x) {
    if (x < 0) { putchar ('-'); x = -x; }
    if (x > 9) print (x / 10);
    putchar (x % 10 + '0');
}

LL absLL (LL x) {
    return x < 0 ? -x : x;
}

struct Point {
    LL x, y;
};

Point operator - (Point a, Point b) {
    return {a.x - b.x, a.y - b.y};
}

LL dist (Point a, Point b = {0,0}) {
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

LL dot (Point a, Point b) {
    return a.x * b.x + a.y * b.y;
}

LL cross (Point a, Point b) {
    return a.x * b.y - a.y * b.x;
}

LL calc (Point a, Point b, LL r) {
    LL da = dist (a), db = dist (b), dab = dist (a, b);
    LL s2 = absLL (cross (a, b));
    if (da < r * r && db < r * r)
        return 0;
    if ( (da > r * r && db < r * r) || (da < r * r && db > r * r)) 
        return 1;
    if (da == r * r && db == r * r)  // 两个点都在圆上
        return 2;
    if (da == r * r || db == r * r) {  // 有一个点在圆上
        if (da < r * r || db < r * r) 
            return 1;
        LL angle1 = dot (a - b, a), angle2 = dot (b - a, b);
        if (angle1 > 0 && angle2 > 0) {
            return 2;
        }
        return 1;
    }
    if (da > r * r && db > r * r) {  // 两个点都在圆外
        LL angle1 = dot (a - b, a), angle2 = dot (b - a, b);
        if (s2 * s2 > dab * r * r)  // 相离
            return 0;
        if (s2 * s2 == dab * r * r) { 
            if (angle1 > 0 && angle2 > 0) 
                return 1;
            else 
                return 0;
        }
        if (s2 * s2 < dab * r * r) { 
            if (angle1 > 0 && angle2 > 0) 
                return 2;
            else 
                return 0;
        }
    }
    return 0;
}

int main() {
    freopen ("H.in", "r", stdin);
    freopen ("H.out", "w", stdout);
    LL xc = read(), yc = read(), r = read();
    LL n = read();
    vector<Point> p(n);
    LL res = 0;
    for (int i = 0; i < n; i += 1) {
        LL x = read(), y = read(); x -= xc; y -= yc;
        p[i] = {x, y};
        if (dist (p[i]) == r * r)
            res -= (n - 1) * (n - 2) / 2;
    }
    for (int i = 0; i < n; i += 1) {
        for (int j = i + 1; j < n; j += 1) {
            LL now = calc (p[i], p[j], r);
            
            print(now); putchar('\n');
            res += now * (n - 2);
        }
    }
    LL pr = n * (n - 1) * (n - 2) / 6;
    double ans = (double) res / pr;
    printf ("%.10lf\n", ans);
}

标签:return,Point,题解,LL,db,da,2024,&&,集训营
From: https://www.cnblogs.com/martian148/p/18032481

相关文章

  • AT_abc213_d [ABC213D] Takahashi Tour 题解(图&深搜)
    传送门题意有一个\(n\)个点的无向图。从根节点\(1\)开始,按如下规则遍历整个图:如果有连接这个点的其他点没有走过,则到这个点。如果有多个点,那么按从小到大的顺序走。如果有这个点没有其他点或者连接这个点的其他点都走过了,那么:如果这个点是根节点\(1\),结束。否则回......
  • 2024牛客寒假算法基础集训营6 G 人生的起落 题解
    Question2024牛客寒假算法基础集训营6G人生的起落定义一个三元组\((x,y,z)\)是“v-三元组”当且仅当该三元组满足以下条件:\(x=z\)\(x>y\)现在需要你构造一个\(n\)个正整数组成的数组,所有元素之和恰好等于\(S\),且恰好有\(k\)个长度威\(3\)的连续子数组......
  • HGAME 2024 WEEK3 crypto
    CRYPTOexRSA题目描述:RRRSAfromCrypto.Util.numberimport*fromsecretimportflagm=bytes_to_long(flag)p=getStrongPrime(1024)q=getStrongPrime(1024)phi=(p-1)*(q-1)e1=inverse(getPrime(768),phi)e2=inverse(getPrime(768),phi)e3=inverse(getPrime(768),phi)......
  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......
  • UVA12422 (Kengdie) Mua (II) - Expression Evaluator 题解
    题目传送门闲话蒟蒻的第一篇黑题题解!连着花了\(12\)个小时才做出来,打代码\(6\)小时,调试\(6\)小时。一开始怎么编也编不过,直到看到了tiger大神的题解才豁然开朗。思路本题主要是输出函数或运算式子的结果,最重要的就是判断优先级。tiger大神提出了表达式树法和递归......
  • Atcoder ABC 342 全题解
    闲话当我还是一个只会AB的小蒟蒻时,由于不会C又看不懂官方题解,只好看网上的题解。结果:ABC签到题不讲AB对着题意模拟即可。A有个好玩的做法,先看前两个,如果不同跟第三个比较,如果相同看后面哪个字母跟第一个不一样。C由于是将所有的$c_i$替换,所以可得同一个字母最......
  • CF1930E 2..3...4.... Wonderful! Wonderful! 题解
    DescriptionStackhasanarray$a$oflength$n$suchthat$a_i=i$forall$i$($1\leqi\leqn$).Hewillselectapositiveinteger$k$($1\leqk\leq\lfloor\frac{n-1}{2}\rfloor$)anddothefollowingoperationon$a$an......
  • 最佳软件架构书籍终极清单 (2024)
          软件架构是成功开发软件产品的基础。精心设计的软件架构可以大大提高系统的质量。它还有助于降低出错风险,并使将来添加新特性和功能变得更加容易。在这篇博文中,我将为您列出2024年最值得一读的软件架构书籍,以及2024年将出版哪些有趣的软件架构书籍。当然,这些书籍......
  • 2024-02-25 闲话
    昨天晚上ABC有prize,然后我和车昱辉本来说问郭军凯要不要acm。后来想了想还是自己玩了玩。现在发现这个决策实在是太明智了,因为:车昱辉:上半学期感觉他一点动静都还没有呢?yspm:这把属于是闷声发大财。车昱辉还有一条锐评,但是实在是太锐了,我强烈怀疑他的大脑里内置了patternr......
  • [ARC155D] Avoid Coprime Game 题解
    Description非负整数\(x,y\)的最大公约数记为\(\gcd(x,y)\),规定\(\gcd(x,0)=\gcd(0,x)=x\)。黑板上写了\(N\)个整数\(A_1,A_2,...,A_N\),这\(N\)个数的最大公约数是\(1\)。Takahashi和Aoki在玩游戏,有一个变量\(G\)初值为\(0\),他们轮流进行以下操作:从黑板上选择......