SYSU-1,URAL 1894,闽科夫斯基和(黑科技)

题目大题:给你两个相交的凸包,其中一个可移动,问你至少移动多少能够让两个凸包分离

解:我艹我为此写了7k计算几何还是wa6了,后面去看discuz才知道是用一个闽科夫斯基和的黑科技。

闽科夫斯基和大概就是两个点集的任意两个点对相加得到的一个新点集,差则是相减。这题用到了以下几个性质:

  1:两个凸包的闽科夫斯基差还是凸包

  2:两个凸包若相交,那么他们闽科夫斯基差的凸包覆盖原点

易知答案是原点到凸包最短距离(可以看作一个凸包平移这个向量,那么他们的闽科夫斯基差就不过原点了,所以相离)

现在问题在于如何快速求差的凸包(定义求是nm的)。wiki告诉我一个性质,就是新凸包的向量组织是两个旧凸包方向边的和。

所以对旧凸包一起选一个方向,然后合并他们的向量,用新向量组合按顺序扫一遍头尾相接就得到差凸包的形状。接下来就是确定位置。我大概yy了下(没有严谨证明),凡是合并之后AB相间的两个向量,他们的头尾坐标和必定是差凸包那个点的原坐标,所以我们比对一下位置凸包这个点的坐标和实际坐标的差平移一下即可。

#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <complex>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <deque>

using namespace std;

const double EPS = 1e-8;

#define ABS(x) ((x)<0?(-(x)):(x))
#define SQR(x) ((x)*(x))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))

#define LSON(x) ((x)<<1)
#define RSON(x) (((x)<<1)+1)
#define LOWBIT(x) ((x)&(-(x)))
#define MAXN 111111
#define LL long long

int cmp(const double &x) {
    return x < -EPS ? -1 : (x > EPS ? 1 : 0);
}

struct point{
    double x, y;
    point(double a = 0, double b = 0): x(a), y(b) {}

    point operator + (const point &rhs) const {
        return point(x + rhs.x, y + rhs.y);
    }
    point operator - (const point &rhs) const {
        return point(x - rhs.x, y - rhs.y);
    }
    point operator * (const double &rhs) const {
        return point(x * rhs, y * rhs);
    }
    point operator / (const double &rhs) const {
        return point(x / rhs, y / rhs);
    }
    bool operator < (const point &rhs) const {
        if (cmp(x - rhs.x) == 0) return y < rhs.y;
        return x < rhs.x;
    }

    void read() {
        scanf("%lf%lf", &x, &y);
    }
    void write() const {
        printf("%lf %lf\n", x, y);
    }
    double norm() const {
        return sqrt(SQR(x) + SQR(y));
    }
};

double dot(const point &a, const point &b) {
    return a.x * b.x + a.y * b.y;
}

double det(const point &a, const point &b) {
    return a.x * b.y - a.y * b.x;
}

typedef point Point;
//#define Point point
typedef pair<Point, Point > Halfplane;
typedef vector<Point > Convex;

inline double arg(const point &a) {
    double res = atan2(a.y, a.x);
    return res;
}

#define cross(a,b) det(a,b)

void PointProjLine(const point &p, const point &s, const point &t, point &cp) {
    double r = dot((t-s), (p-s))/dot(t-s, t-s);
    cp = s + (t - s) * r;
}

int n, m;
Convex a, b, c;
double ans;

struct data{
    double a;
    point st, ed;
    int col;
    data() {}
    data(double aa, point b, point c, int d): a(aa), st(b), ed(c), col(d) {}
    bool operator < (const data &rhs) const {
        return a < rhs.a;
    }
};

vector <data > aa;
vector <point > key;

const double PI = acos(-1);

void init() {
    double ans = 1e30;
    Point x;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) {
        x.read(); a.push_back(x);
    } a.push_back(a[0]);

    for (int i = 0; i < n; ++i) {
        aa.push_back(data(arg((a[i+1] - a[i])) + 2 * PI, a[i], a[i+1], 0));
    }

    for (int i = 0; i < m; ++i) {
        x.read(); b.push_back(x*-1);
    } b.push_back(b[0]);
    for (int i = 0; i < m; ++i) {
        aa.push_back(data(arg((b[i+1] - b[i])) + 2 * PI, b[i], b[i+1], 1));
    }
    sort(aa.begin(), aa.end());
}

double dist(const point &p, const point &s, const point &t) {
    point tt;
    PointProjLine(p, s, t, tt);
    return (p - tt).norm();
}

void solve() {
    point now = point(0, 0);
    aa.push_back(aa[0]);
    for (int i = 0; i < n+m; ++i) {
        now = now + (aa[i].ed - aa[i].st);
        key.push_back(now);
    }
    point dd;
    key.push_back(key[0]);

    for (int i = 0; i + 1 < n+m; ++i) {
        if (aa[i].col != aa[i+1].col) {
            dd = (aa[i].ed + aa[i+1].st) - key[i];
            break;
        }
    }
    for (int i = 0; i < key.size(); ++i) {
        key[i] = key[i] + dd;
    }
    ans = 1e30;
    for (int i = 0; i < n+m; ++i) {
        ans = min(ans, dist(point(0, 0), key[i], key[i+1]));
    }
}

int main() {
    freopen("test.txt", "r", stdin);
    init();
    solve();
    if (ans < 60) puts("0");
    else printf("%.8lf\n", max(0.0, ans - 60));
    return 0;
}

ural 1894

时间: 2024-10-06 00:51:48

SYSU-1,URAL 1894,闽科夫斯基和(黑科技)的相关文章

“长江钢琴”入选“第16届柴科夫斯基国际音乐比赛”比赛用琴

“长江钢琴”入选“第16届柴科夫斯基国际音乐比赛”比赛用琴 签约仪式隆重举行 长江钢琴入选“第16届柴科夫斯基国际音乐比赛”比赛用琴签约仪式于2019年3月8日隆重举行.第16届柴科夫斯基国际音乐比赛钢琴组评委主席丹尼斯·马祖耶夫先生与著名钢琴家李名强教授.柏斯音乐集团总裁吴雅玲女士.吴天延先生及音乐艺术界的多位名家共同出席签约仪式,正式宣布柏斯音乐集团自主研发生产的“长江钢琴”成为“2019年第16届俄罗斯柴科夫斯基国际音乐比赛”比赛用琴,见证中国钢琴登顶世界最高艺术舞台! 第16届柴科夫斯基

《喀秋莎》词作者伊萨科夫斯基

<喀秋莎>词作者伊萨科夫斯基老家的文化馆里,开了一家"<喀秋莎>博物馆",里面保存着世界各地,用不同语言翻译和出版的<喀秋莎>歌篇http://www.ximalaya.com/zhubo/27347791/ http://www.ximalaya.com/zhubo/27347801/ http://www.ximalaya.com/zhubo/27347808/ http://www.ximalaya.com/zhubo/27347811/ ht

引Uber和谷歌之争的莱万多夫斯基或回归自动驾驶行业

来源:cnBeta 援引外媒TechCrunch报道,引爆Google和Uber之争的工程师安东尼?莱万多夫斯基(Anthony Levandowski)近日回归,同一家自动驾驶卡车公司有着密切的联系.这家公司名为Kache.ai(发音有点类似于缓存cache),直到7个月前该公司向加州州政府秘书长提交的首份报告中才走进媒体视野. 虽然在这份报告中并未提及莱万多夫斯基,但在这份文件中显示"Thomas S. Lee Jr."为公司总裁.通过查询LinkedIn之后发现,Lee是一名软件

米列夫斯基《投资与养老》- 读后感

在网上看到有人提到这本书,名字里面还有"司机",不同的民族,不同的视角,于是把书买来细细一读. 有很多的思想和内容确实是以前不曾想到的,一本书,只要有一个观点能够融入自己的思想和价值体系中,那么这本书我觉的就值了. 宏观上的观点 人力资本是最大的权重,尤其对三十岁以下的人(书中提到的是35岁,可能是美国和中国的教育体系的差异): 提升人力资本价值的投资长期看是最有效投资. 只讨论房产,股票,保险,债券,现金,保险是不够的,不考虑人力资本价值的配置完全有局限性的. 年轻人要有早晚要成为自

从贝叶斯理论到图像马尔科夫随机场

本节主要介绍马尔科夫的随机场模型以及其用于图像的分割算法中.基于马尔科夫的随机场(MRF)的图像分割是一种基于统计的图像分割算法,其模型参数少,空间约束性强,使用较为广泛. 首先了解一下马尔科夫模型,纯粹的马尔科夫模型就是指一件事物的当前状态只与它之前的1个或者n个状态有关,而与再之前的状态没有关系,比如今天天气好坏只与昨天天气有关,而与前天乃至大前天都没有关系.符合这样的一种特性的事物认为其具有马尔科夫性.那么引申到图像领域,就是认为图像中某一点的特征(一般都是像素点灰色.颜色值等)只与其附近

隐马尔科夫模型HMM

隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程.其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析.在早些年HMM模型被非常广泛的应用,而现在随着机器学习的发展HMM模型的应用场景越来越小然而在图像识别等领域HMM依然起着重要的作用. 引言: 隐马尔科夫模型是马尔科夫链的一种,它

PGM学习之七 MRF,马尔科夫随机场

之前自己做实验也用过MRF(Markov Random Filed,马尔科夫随机场),基本原理理解,但是很多细节的地方都不求甚解.恰好趁学习PGM的时间,整理一下在机器视觉与图像分析领域的MRF的相关知识. 打字不易,转载请注明.http://blog.csdn.net/polly_yang/article/details/9716591 在机器视觉领域,一个图像分析问题通常被定义为建模问题,图像分析的过程就是从计算的观点来求解模型的过程.一个模型除了可以表达成图形的形式外,通常使用一个目标函数

马尔科夫随机场

之前自己做实验也用过MRF(Markov Random Filed,马尔科夫随机场),基本原理理解,但是很多细节的地方都不求甚解.恰好趁学习PGM的时间,整理一下在机器视觉与图像分析领域的MRF的相关知识. 转载于http://blog.csdn.NET/polly_yang/article/details/9716591 在机器视觉领域,一个图像分析问题通常被定义为建模问题,图像分析的过程就是从计算的观点来求解模型的过程.一个模型除了可以表达成图形的形式外,通常使用一个目标函数来表示,因此建模

自然语言处理---用隐马尔科夫模型(HMM)实现词性标注---1998年1月份人民日报语料---learn---test---evaluation---Demo---java实现

先放上一张Demo的测试图 测试的句子及每个分词的词性标注为:   目前/t 这/rzv 条/q 高速公路/n 之间/f 的/ude1 路段/n 已/d 紧急/a 封闭/v ./w 需要基础知识 HMM模型(隐马尔可夫模型) 模型的定义 隐马尔科夫模型(hidden Markov model)是关于时序的概率模型,是最简单的动态贝叶斯网络 模型的参数 HMM模型由Pi.A.B 唯一决定   Pi.A.B 成为HMM模型的三要素 HMM用在词性标注问题 对于下面这句话可以用HMM进行建模 目前/t