计算几何小结计算几何小结

计算几何小结

计算几何是个好东西,写代码感觉在写LemonLime(不你没真正写过),一层层堆叠起来,真(难)好(调)玩。

占坑

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<assert.h>
#define pf(x) ((x)*(x))

using namespace std;  typedef long long ll;
inline int qr(){
    int ret=0,f=0,c=getchar();
    while(!isdigit(c))f|=c==45,c=getchar();
    while(isdigit(c)) ret=ret*10+c-48,c=getchar();
    return f?-ret:ret;
}

struct NODE{
    double x,y;
    NODE operator + (NODE b)const{return {x+b.x,y+b.y};}
    NODE operator - (NODE b)const{return {x-b.x,y-b.y};}
    NODE operator * (double b)const{return {x*b,y*b};}
    double operator % (NODE b)const{return x*b.y-y*b.x;}
    double operator ^ (NODE b)const{return sqrt(pf(x-b.x)+pf(y-b.y));}
    bool operator < (NODE b)const{return atan2(y,x)<atan2(b.y,b.x);}
    bool operator == (NODE b)const{return x==b.x&&y==b.y;}
};

double atan2(NODE a){return atan2(a.y,a.x);}

struct LINE{
    NODE vec,pt;
    LINE(NODE a,NODE b):vec(b-a),pt(a){}
    bool operator < (LINE b)const{return atan2(vec)==atan2(b.vec)?b.vec%(pt-b.pt)>0:vec<b.vec;}
    NODE operator * (LINE b)const{
        //no exist para
        NODE A=vec,B=b.vec,C=b.pt-pt;
        //if(B%A==0) return {1e9,1e9};
        double t=(B%C)/(B%A);
        //assert(t==t);
        return pt+vec*t;
    }
};

typedef vector<NODE> mat;
typedef vector<LINE> poly;
poly data;
const double bound=1000;
double sum(poly data){
    if(data.size()<3) return 0;
    double ret=0;
    sort(data.begin(),data.end());
    NODE x={0,0};
    for(int t=0,ed=data.size();t<ed;++t)
        ret+=(data[t]*data[(t-1+ed)%ed]-x)%(data[t]*data[(t+1)%ed]-x);
    assert(ret==ret);
    return ret/2;
}

poly Surface(poly _data){
    sort(_data.begin(),_data.end());
    poly data;
    for(int t=0,r=0,ed=_data.size();r<ed;t=++r){
        while(r+1<ed&&atan2(_data[t].vec)==atan2(_data[r+1].vec)) ++r;
        data.push_back(_data[t]);
    }
    deque<LINE> q(data.begin(),data.begin()+2);
    for(int t=2,ed=data.size();t<ed;++t){
        while(q.size()>1){
            NODE m=q[q.size()-1]*q[q.size()-2];
            assert(m.x<=1e7);
            if(data[t].vec%(m-data[t].pt)<0) q.pop_back();
            else break;
        }
        while(q.size()>1){
            NODE m=q[0]*q[1];
            assert(m.x<=1e7);
            if(data[t].vec%(m-data[t].pt)<0) q.pop_front();
            else break;
        }
        q.push_back(data[t]);
    }
    while(q.size()>1){
        NODE m=q[q.size()-1]*q[q.size()-2];
        assert(m.x<=1e7);
        if(q.front().vec%(m-q.front().pt)<0) q.pop_back();
        else break;
    }
    while(q.size()>1){
        NODE m=q[0]*q[1];
        assert(m.x<=1e7);
        if(q.back().vec%(m-q.back().pt)<0) q.pop_front();
        else break;
    }
    return poly(q.begin(),q.end());
}

int main(){
    int n=qr();
    for(int t0=1;t0<=n;++t0){
        mat sav(qr());
        for(auto&t:sav) t.x=qr(),t.y=qr();
        for(int i=0,ed=sav.size();i<ed;++i)
            data.push_back(LINE(sav[i],sav[(i+1)%ed]));
        sort(data.begin(),data.end());
    }
    double k=sum(Surface(data));
    printf("%.5lf\n",k);
    return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/12142688.html

时间: 2024-07-31 21:51:33

计算几何小结计算几何小结的相关文章

Github使用小结

Github使用小结 git 小结 1.ubuntu下安装git环境 ubuntu 16.04已经自带git ,可以通过下列命令进行安装与检测是否成功安装 sudo apt-get inst all git //安装 //git命令出现代表安装成功(为考证)  [email protected]:/# git  usage: git [--version] [--help] [-C <path>] [-c name=value]  [--exec-path[=<path>]] [-

BZOJ 1027 JSOI2007 合金 计算几何+Floyd

题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所以我们仅仅要得到a和b就可以 c=1-a-b 所以c能够不读入了 然后我们把每种原料抽象成一个点 可知两个点能合成的合金一定在两点连线的线段上 证明:设两个点为(x1,y1)和(x2,y2),新合成的合金为(ax1+bx2,ay2+by2) (a+b=1,a,b>0) 两点连线为(y-y1)/(x-

计算几何小结

计算几何小结! 零,说在前面 (转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/8379553.html ) 这次总结的是计算几何! 根据学长们的观点,计算几何是一类0or100的题目 但是事实上,计算几何题目很考验码力和细节处理能力,以及数学上平几和立体几何那堆东西…… 我个人觉得这样的题目是对个人很好的锻炼,虽然我考场上还是只能打暴力罢了2333 那么我们开始总结吧! 一,凸包 这大概是我们的万恶之源了……这里我把之前的凸包总结搬过来 然后续写两句现在的

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,

【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET

原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,请

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资