zoukankan      html  css  js  c++  java
  • BZOJ

    题意:求n个凸多边形的交面积。

    半平面交模板题。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef double db;
     5 const int N=1000+10,inf=0x3f3f3f3f;
     6 const db pi=acos(-1),eps=1e-8;
     7 struct P {
     8     db x,y;
     9     P operator-(P b) {return {x-b.x,y-b.y};}
    10     P operator+(P b) {return {x+b.x,y+b.y};}
    11     P operator*(db b) {return {x*b,y*b};}
    12     bool operator<(const P& b)const {return x!=b.x?x<b.x:y<b.y;}
    13     bool operator==(const P& b)const {return x==b.x&&y==b.y;}
    14 } p[N],hpi[N];
    15 db cross(P a,P b) {return a.x*b.y-a.y*b.x;}
    16 struct Line {
    17     P p,v;
    18     db rad()const {return atan2(v.y,v.x);};
    19 } line[N],q[N];
    20 bool onleft(P p,Line a) {return cross(a.v,p-a.p)>0;}
    21 P its(Line a,Line b) {
    22     P v=a.p-b.p;
    23     db t=cross(b.v,v)/cross(a.v,b.v);
    24     return a.p+a.v*t;
    25 }
    26 bool operator<(const Line& a,const Line& b) {
    27     db r1=a.rad(),r2=b.rad();
    28     return fabs(r1-r2)>eps?r1<r2:onleft(a.p,b);
    29 }
    30 int n,m,nl,nhpi;
    31 void HPI() {
    32     sort(line,line+nl);
    33     int hd=0,tl=-1;
    34     for(int i=0; i<nl; ++i) {
    35         if(hd<=tl&&fabs(line[i].rad()-q[tl].rad())<eps)continue;
    36         if(hd<tl&&cross(q[hd].v,q[tl].v)<0&&onleft(its(q[hd],q[tl]),line[i]))continue;
    37         for(; hd<tl&&!onleft(its(q[tl-1],q[tl]),line[i]); --tl);
    38         for(; hd<tl&&!onleft(its(q[hd],q[hd+1]),line[i]); ++hd);
    39         q[++tl]=line[i];
    40     }
    41     nhpi=0;
    42     for(int i=hd; i<tl; ++i)hpi[nhpi++]=its(q[i],q[i+1]);
    43     hpi[nhpi++]=its(q[tl],q[hd]);
    44 }
    45 db area() {
    46     db ret=0;
    47     for(int i=1; i<nhpi-1; ++i)ret+=cross(hpi[i]-hpi[0],hpi[i+1]-hpi[0]);
    48     return fabs(ret/2);
    49 }
    50 
    51 int main() {
    52     for(scanf("%d",&m); m--;) {
    53         scanf("%d",&n);
    54         for(int i=0; i<n; ++i)scanf("%lf%lf",&p[i].x,&p[i].y);
    55         for(int i=0; i<n; ++i)line[nl++]= {p[i],p[(i+1)%n]-p[i]};
    56     }
    57     HPI();
    58     printf("%.3f
    ",area());
    59     return 0;
    60 }
  • 相关阅读:
    查看docker程序使用的内存脚本
    shell分割字符串并赋值给变量
    【Ceph】Ceph学习理解Ceph的三种存储接口:块设备、文件系统、对象存储
    删除软连接导致源文件一起被删除
    nginx+keepalived实现双活
    maven私有仓库的搭建
    直接访问nginx ip地址返回404错误
    Solaris基础系列之四:图解Oracle 10g安装
    数据库进阶系列之一:漫谈数据库索引
    Tips&Tricks系列四:C#面试笔试小贴士
  • 原文地址:https://www.cnblogs.com/asdfsag/p/10489790.html
Copyright © 2011-2022 走看看