首页 > 其他分享 >2024 (ICPC) Jiangxi Provincial Contest I 题 Neuvillette Circling题解

2024 (ICPC) Jiangxi Provincial Contest I 题 Neuvillette Circling题解

时间:2025-01-20 23:55:36浏览次数:1  
标签:Provincial cnt Contest 题解 ll xtemp vec ytemp

简单思路

一个圆套中了几个点,如果不断缩小这个圆,那么最终的结果有两种

  1. 有两个点卡住了这个圆,且这两点一定是直径
  2. 有三个或者三个以上的点卡住了这个圆,圆心在这三个点围成的三角形的外接圆圆心。

因此我们枚举两点作为直径,或者枚举三个点作为圆的内接三角形,求这个三角形的外接圆圆心即可。

最后对这些圆进行判断一共围住了几个点。

复杂度大概\(O(n^3+n^4)\)

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define endl '\n'
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define Forget_that return
#define f(x, y) (x * x + y * y)
#define Just_go 0
#define Endl endl
#define ednl endl
#define eldn endl
#define dnel endl
#define enndl endl
#define Ednl endl
#define Edml endl
#define llmax 9223372036854775807
#define intmax 2147483647
#define f(x, y) (x * x + y * y)

struct point
{
    ld x;
    ld y;
    point(ld xx = 0, ld yy = 0)
    {
        x = xx;
        y = yy;
    }

} arr[100000];

point fun(const point &p1, const point &p2, const point &p3)  //求三角形外接圆圆心
{
    ld x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y;
    ld d1 = f(x2, y2) - f(x1, y1), d2 = f(x3, y3) - f(x2, y2);
    ld fm = 2 * ((y3 - y2) * (x2 - x1) - (y2 - y1) * (x3 - x2));
    ld ans_x = ((y3 - y2) * d1 - (y2 - y1) * d2) / fm;
    ld ans_y = ((x2 - x1) * d2 - (x3 - x2) * d1) / fm;
    return point(ans_x, ans_y);
}

struct circle
{
    ld x;
    ld y;
    ld r;
    int cnt;
    circle(ld xx, ld yy, ld rr)
    {
        x = xx;
        y = yy;
        r = rr;
        cnt = 0;
    }
};

ld dis(const point &a, const point &b)
{
    return sqrtl(1.0L * (a.x - b.x) * (a.x - b.x) + 1.0L * (a.y - b.y) * (a.y - b.y));
}

ld dis(const circle &a, const point &b)
{
    return sqrtl(1.0L * (a.x - b.x) * (a.x - b.x) + 1.0L * (a.y - b.y) * (a.y - b.y));
}

bool isIn(const circle &x, const point &b)
{
    ld dist = dis(x, b);
    if (dist < x.r)
        return true;
    if (abs(dist - x.r) < 1e-7)
        return true;
    return false;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;

    cin >> n;
    _rep(i, 1, n)
    {
        ll xtemp;
        ll ytemp;
        cin >> xtemp >> ytemp;
        arr[i].x = xtemp;
        arr[i].y = ytemp;
    }
    vector<circle> vec;

    for (int i = 1; i <= n; i++)      //枚举直径,构造圆
    {
        for (int j = i + 1; j <= n; j++)
        {
            vec.push_back(circle(0.5L * (arr[i].x + arr[j].x), 0.5L * (arr[i].y + arr[j].y), 0.5L * dis(arr[i], arr[j])));
        }
    }

    for (int i = 1; i <= n; i++)   //枚举三角形,求外接圆
    {
        for (int j = i + 1; j <= n; j++)
        {
            for (int k = j + 1; k <= n; k++)
            {
                point temp = fun(arr[i], arr[j], arr[k]);   //外接圆圆心
                vec.push_back(circle(temp.x, temp.y, dis(temp, arr[i])));
            }
        }
    }

    for (auto it = vec.begin(); it != vec.end(); it++)
    {
        for (int i = 1; i <= n; i++)
        {
            if (isIn(*it, arr[i]))    //判断圆中包含多少个点
                it->cnt++;
        }
    }

    vector<ld> ans(n + 10, 1e14);

    for (auto it = vec.begin(); it != vec.end(); it++)  //写题解的时候发现这里应该判断一下,因为有可能不存在圆能恰好围住x个点,但是存在圆能恰好围住x+1个点。建议加强数据,也有可能我写题解的时候想多了。
        ans[it->cnt] = min(it->r, ans[it->cnt]);

    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j < i; j++)
        {
            cout << fixed << setprecision(10) << ans[i] << endl;
        }
    }

    Forget_that Just_go;
}

标签:Provincial,cnt,Contest,题解,ll,xtemp,vec,ytemp
From: https://www.cnblogs.com/acidbarium/p/18682673

相关文章

  • 2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解
    简单思路首先对于所有的出口求一遍最短路,由于出口只会打开并关闭一次,所以大门的开启状态是相当有限的(最多大概30种),我们对于每一种状态直接暴力求答案最后输出即可。复杂度大概\(O(knlogn)\)参考代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;type......
  • VP AtCoder Beginner Contest 380
    A-123233模拟即可。点击查看代码voidsolve(){intcnt[10]{};intn;std::cin>>n;while(n){ ++cnt[n%10]; n/=10;}for(inti=1;i<=3;++i){ if(cnt[i]!=i){ std::cout<<"No\n&qu......
  • Codeforces Round 998 (Div. 3) 部分题解
    写题解的时候这场在评测,就不放代码了。E.GraphComposition题意给两个无向简单图,对图\(1\)添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。题解求出图\(2\)的连通性,考虑图\(1\)的所有边,若违背了图\(2\)联通性的要删除(图\(2\)不联通但图\(......
  • 20250120 T2 simu题解
    简单模拟(simu)【题目描述】给定$a_1,a_2,\ldots,a_n$和$b_1,b_2,\ldots,b_n$。对于所有整数$x\in[l,r]$,模拟以下过程并求出变量$res$的最终的值。res=0fori=1ton:ifx>=a[i]:x=x-a[i]res=res+b[i]【输入格式】......
  • 「题解」二进制与一
    传送门:水滴、洛谷题目大意:给定一个正整数$n$,给出操作次数$p$。每次操作让$n$加上一个非负整数$x$,使得$n$的第$k$位为$0$(从右往左数)。如果本身为$1$就不用操作。且每次操作$n+x$回影响后续操作。问$x$的和是多少。首先我们要知道,判断$n$的第$k$位是否为$......
  • AtCoder Grand Contest 001
    AtCoderGrandContest001-AtCoder.CDEF看了题解才会。2025.1.17打比赛、补题。2025.1.18写题解。A简单贪心,排序后相邻的放一起。B有点吓人,但是画图手玩一下就可以看出,除了开头和结尾,每一轮是在走一个平行四边形,于是递归。类似辗转相除法求\(\gcd\)递归算一下(不是......
  • AtCoder Grand Contest 002
    AtCoderGrandContest002-AtCoder.EF赛时不会,ENekopedia给我讲了,F看了题解。2025.1.18打比赛、补题、写题解。A随便分讨一下。有一种是看\((b-a+1)\)的奇偶性。可以按\(a<0,a=0,a>0\)来先对\(a\)分类,再分讨对应的\(b\)。总结:注意思路清晰点,分讨要有条理,不要......
  • 题解:CF580B Kefa and Company
    CF580BKefaandCompany前言。其实本题与这道题极为相似,所以建议降橙。思路因为输入顺序不影响就结果,所以可以先给\(a\)按照工资从小到打排序一下序(这里\(a\)使用MAP)。然后再使用尺取法,只要\(a_{r+1}\)的值减\(a_l\)的值\(\ltk\)就将\(r\)加\(1\)。然后发现每......
  • [BZOJ3160] 万径人踪灭 题解
    首先正难则反,想到答案即为满足第一条要求的回文子序列数量,减去回文子串数量。回文子串数量\(hash+\)二分即可,考虑前半部分。假如我们将一个回文子序列一层层剥开,就会发现它其实是由多个相同的字母对拼成的。那么容易想到把字母\(a\)和字母\(b\)的贡献分开计算。那第一条要......
  • PKUWC 2025 题解
    本人太菜,实在不会T3,所以只有T1,T2的题解。注:考场上只做出来了Day1T1,其他题参考了其他人的题解。Day1T1电池检测题面有\(a\)个有电的电池和\(b\)个没电的电池,每次只能选择两个电池放进手电筒,只有这两个电池全有电才能让手电筒启动。问最坏情况下最少可以让手电筒启......