首页 > 其他分享 >2023湖南

2023湖南

时间:2023-04-06 17:46:58浏览次数:39  
标签:return Point int 2023 湖南 const Line Segment

C++ Code
#include "bits/stdc++.h"

using namespace std;
using i64 = long long;

using Real = double;
using Point = complex<Real>;

#define x real
#define y imag

constexpr Real eps = 1E-9;

int sign(const Real &x) {
    return x < -eps ? -1 : x > eps ? 1 : 0;
}

struct Line {
    Point a, b;
    Line() {}
    Line(const Point &a, const Point &b) : a(a), b(b) {}
};

struct Segment : Line {
    Segment() = default;
    using Line::Line;
    Real len() const {
        return abs(a - b);
    }
};

Real cross(const Point &a, const Point &b) {
    return (conj(a) * b).y();
}

Real dot(const Point &a, const Point &b) {
    return (conj(a) * b).x();
}

int onLeft(const Point &p, const Line &l) {
    return sign(cross(l.b - l.a, p - l.a));
}

bool collinear(const Line &l1, const Line &l2) {
    return sign(cross(l1.b - l1.a, l2.b - l2.a)) == 0 && sign(cross(l1.b - l1.a, l1.b - l2.a)) == 0;
}

bool intersect(const Segment &s1, const Segment &s2) {
    return onLeft(s2.a, s1) * onLeft(s2.b, s1) <= 0 && onLeft(s1.a, s2) * onLeft(s1.b, s2) <= 0;
}

bool onSegment(const Point &p, const Segment &s) {
    return sign(cross(p - s.a, s.b - s.a)) == 0 && sign(dot(p - s.a, p - s.b)) <= 0;
}

// -1 : on, 0 : out, 1 : in
int contains(const Point &p, const vector<Point> &g) {
    int gsz = g.size();
    bool in = false;
    for(int i = 0; i < gsz; i++) {
        Point a = g[i] - p, b = g[(i + 1) % gsz] - p;
        if (a.y() > b.y()) swap(a, b);
        if (a.y() <= 0 && 0 < b.y() && cross(a, b) < 0) in = !in;
        if (cross(a, b) == 0 && dot(a, b) <= 0) return -1;
    }
    return in ? 1 : 0;
}

void solve(int n) {
    vector<Point> a(n);
 
    for (int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        a[i] = Point(x, y);
    }

    int x, y;
    cin >> x >> y;
    Point s = Point(x, y);
    cin >> x >> y;
    Point t = Point(x, y);

    auto check = [&](const Segment &S) {
        for (int i = 0; i < n; i++) {
            Segment T(a[i], a[(i + 1) % n]);
            if (collinear(S, T)) {
                continue;
            }
            if (intersect(S, T) && !onSegment(S.a, T) && !onSegment(S.b, T)) {
                return false;
            }
        }
        Point mid = (S.a + S.b) / 2.0;
        if (contains(mid, a) == 1){
            return false;
        }
        return true;
    };

    vector<Point> P;
    P.push_back(s);
    P.push_back(t);
    for (int i = 0; i < n; i++) {
        P.push_back(a[i]);
    }

    int m = P.size();
    vector<vector<pair<int, double>>> g(m);

    for (int i = 0; i < m; i++) {
        for (int j = i + 1; j < m; j++) {
            Segment S(P[i], P[j]);
            if (check(S)) {
                g[i].push_back({j, S.len()});
                g[j].push_back({i, S.len()});
            }
        }
    }

    priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>>> q;
    vector<int> vis(m);
    vector<double> dis(m, 1E9);
    dis[0] = 0;
    q.push({dis[0], 0});
    while (!q.empty()) {
        double u = q.top().first;
        int v = q.top().second;
        q.pop();
        if (v == 1) {
            cout << dis[1] << '\n';
            return;
        }
        if (!vis[v]) {
            vis[v] = 1;
            for (auto d : g[v]) {
                int x = d.first;
                double w = d.second;
                if (dis[x] > dis[v] + w) {
                    dis[x] = dis[v] + w;
                    q.push({dis[x], x});
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cout << fixed << setprecision(15);

    int n;
    while (cin >> n) {
        solve(n);
    }
    
    return 0;
}

标签:return,Point,int,2023,湖南,const,Line,Segment
From: https://www.cnblogs.com/kiddingma/p/17293559.html

相关文章

  • 2023.04.06 - vue组件中动态指定监听的值
    业务场景:高拍仪给出的视频信息API回调里会不断返回图像数据。因为有主副摄像图像信息,并且两个图像信息会二选一展示在DOM容器里。所以就是二对一的关系。//主摄像数据letpriPic:string='';//副摄像数据letsubPic:string='';//展示在容器的数据=主摄像数据||副摄像......
  • Rabbit-分布式事务实例 20230406
     一、生产、消费者流程        1、生产者(下单后生产务必成功)派单队列:order_platonn_queue交换机:order_exchange_name绑交换机路由键:orderRoutingKey生产者=>采用confirm,确认应答机制Ack模式:成功......
  • 游记 | 20230402 · 牛首山踏春 · 南京眼夜景
    目录0周六晚·准备1周日白天·牛首山1.1出发·随流·抄近路1.2游览佛顶宫1.3河堤·湖岸·桃花溪2周日下午·新发现(河西天街店)·蘇小柳(河西分院)3周日晚上·南京眼·保利大剧院总结0周六晚·准备去年秋天,我们三个去了栖霞山;今年春天,打算去牛首山逛......
  • 20230406 英语学习进度慢
    我从2月中开始,一直在做精听的练习.但是,你关于精听的进度,你认为太慢了.你的听力加起来,不至5篇,这个量,我认为是严重不足地.正如大佬所言,20篇以上的精听&英转中的完全掌握,将会有英语的极大提升.一方面,精听的确需要大量的时间投入.但是,另外一方面,你的确时间投入需要加......
  • 20230406-python-yaml文件操作
               ......
  • 2023.04.06 - 使用mixin动态混入,对vue组件中的数据做兼容经验总结(xp)
    业务场景:在一个高拍仪的硬件设备中,厂家给了两套不同的API,分别支持winXP和winXP以上版本的系统,而这两套API的实现方式截然不同,一套使用的是http通信,一套是使用scoket通信,方法的调用自然也是不同。我需要在同一组件兼容这两套代码。这种需求下很明显,我除了修改组件里的函数方法,......
  • 2023 海外工具站 2 月复盘
    观点:关于AIGC最近看的这块挺多。分享下我对AIGC的一些观点AIGC(AIGeneratedContent)是由AI生成的内容。我认为的内容很多,文字、图片、视频、音频、3D等等观点1:AIGC不应该卷互联网行业,for工业for生产。比如服装来源于设计稿,应该由AI辅助,让服装设计plus下观点2......
  • 2023年成都.NET线下技术沙龙来了!大咖分享,报名从速
    MASA技术团队来成都啦!我们联合了成都.NET俱乐部,将在成都市举办一场.NET线下技术沙龙,为.NET开发者创造一次交流学习的契机,我们邀请到的几位技术大咖,将会围绕各自的主题向大家分享他们的技术心得。本场沙龙名额有限,以报名优先为准。时间2023年4月15日13:30-17:30地址四川省成......
  • CodeStar2023年春第3周周赛普及奠基组
    T1:字符串加密本题难度简单,根据题目描述模拟即可。代码实现#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(char&c:s){if(islower(c))c-=32;elsec+=32;}reverse(s.beg......
  • 2023省选总结
    Day18:30迅速看完T1,T2题面,举手上厕所思考。8:50发现T1没啥可做的,T2花约5分钟想清楚题意。9:00回来码完T1。测大样例发现全过,思考感觉不好拍,于是没写拍。开始思考T2。10:00初步想到转化成圆方树的建模,但是不很自信。思想斗争约10分钟后胡出一个证明(似乎是真的......