[模板]计算几何(一)

凸包

#include<set>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100001
#define eps 1e-11
using namespace std;
struct point{
    int x,y;double t;
}a[N],v[N];
int n,u,vn;
inline double sqr(int k){
    return (double)(k*k);
}
inline point dec(point x,point y){
    return (point){x.x-y.x,x.y-y.y,0.0};
}
inline int mult(point x,point y){
    return x.x*y.y-y.x*x.y;
}
inline double dis(point x,point y){
    return sqrt(sqr(abs(x.x-y.x))+sqr(abs(x.y-y.y)));
}
inline bool cmp(point x,point y){
    if(fabs(x.t-y.t)<eps)
        return dis(x,a[1])>dis(y,a[1]);
    return x.t<y.t;
}
inline void convex(){
    u=1;
    for(int i=2;i<=n;i++)
        if((a[i].x<a[u].x)||(a[i].x==a[u].x&&a[i].y<a[u].y)) u=i;
    a[0]=a[u];a[u]=a[1];a[1]=a[0];
    for(int i=2;i<=n;i++)
        a[i].t=atan2(a[i].y-a[1].y,a[i].x-a[1].x);
    sort(a+2,a+1+n,cmp);
    v[++vn]=a[1];v[++vn]=a[2];a[++n]=a[1];
    for(int i=3;i<=n;i++){
        if(fabs(a[i].t-a[i-1].t)<eps)
            continue;
        while(vn>1&&mult(dec(a[i],v[vn-1]),dec(v[vn],v[vn-1]))>0) vn--;
        v[++vn]=a[i];
    }
}
inline void init(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    convex();
}
int main(){
    freopen("convex.in","r",stdin);
    freopen("convex.out","w",stdout);
    init();
    fclose(stdin);
    fclose(stdout);
    return 0;
}

旋转卡壳

#include<set>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1000001
using namespace std;
struct point{
    int x,y;
}a[N];
int n;
inline point dec(point x,point y){
    return (point){x.x-y.x,x.y-y.y};
}
inline int mult(point x,point y){
    return x.x*y.y-x.y*y.x;
}
inline double sqr(int k){
    return (double)(k*k);
}
inline double dis(point x){
    return sqrt(sqr(x.x)+sqr(x.y));
}
inline int Next(int k){
    if(++k>n) return 1;
    return k;
}
inline double rorate(){
    double di,dia=0.0;
    if(n==1) return dia;
    for(int i=1,j=2;i<=n;i++){
        while(mult(dec(a[Next(i)],a[i]),dec(a[j],a[i]))<mult(dec(a[Next(i)],a[i]),dec(a[Next(j)],a[i])))
            j=Next(j);
        di=dis(dec(a[i],a[j]));
        if(di>dia) dia=di;
        di=dis(dec(a[Next(i)],a[Next(j)]));
        if(di>dia) dia=di;
    }
    return dia;
}
inline void init(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    printf("%lf\n",rorate());
}
int main(){
    freopen("rorate.in","r",stdin);
    freopen("rorate.out","w",stdout);
    init();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
时间: 2024-08-10 00:05:44

[模板]计算几何(一)的相关文章

[模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

//to update 一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson 凸包 Andrew 算法, 即分别求上, 下凸包. 时间复杂度 \(O(n \log n)\). struct tvec{db x,y;}; il int dcmp(db a){return fabs(a)<=eps?0:(a>0?1:-1);} il db p2(db a){return a*a;} il db gougu1(db a,db b){retu

模板-计算几何

计算几何算法相关模版, 可能有错误, 省选前持续更正中 重要的不是模版内容, 而是提供算法的实现思路.

算法模板——计算几何2(二维凸包——Andrew算法)

实现功能:求出二维平面内一对散点的凸包(详见Codevs 1298) 很神奇的算法——先将各个点按坐标排序,然后像我们所知的那样一路左转,求出半边的凸包,然后反过来求另一半的凸包 我以前正是因为总抱着想一步到位的想法,所以每次都跪得很惨(HansBug:事实上这次是我这辈子第一次A掉凸包题) 然后别的没了,就是凸包的基本思想 (顺便输出凸包周长C和面积S,好评如潮哦) 1 type arr=array[0..100005] of longint; 2 var 3 i,j,k,l,m,n,m1,m

计算几何-圆 模板 训练指南267

#include #include #include #include #include #include #include #include #include #include #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const double eps = 1e-10; const int inf = 0x3f3f3f3f; using namespace

hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的

计算几何 部分常用函数模板

来自<算法竞赛入门经典-训练指南> 刘汝佳/陈峰 清华大学出版社 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const double eps = 1e-8; int dcmp(double x) /

【模板整合】【及时更新】【天坑】计算几何模板

计算几何模板要写的内容真多- 我写烦了-先写这些放上来吧- #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #define MAXDBL 1e20 #define eps 1e-9 #define pi acos(-1) using namespace std; stru

计算几何 --- 凸包 模板

//Memory Time // 1347K 0MS // by : Snarl_jsb #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<map> #

【转】计算几何模板

[转载注明出处 @AOQNRMGYXLMV ] #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; //lrj计算几何模板 struct Point { double x, y; Point(double x=0, double y=0) :x(x),y(y) {} }; typedef Point Vector; Poi