caioj1215

来源:互联网 发布:淘宝视频制作多少钱 编辑:程序博客网 时间:2024/06/06 09:37

半平面交的第一题啦!纪念一下。。
本来大部队学的是O(nlogn)的算法,但因为我比较懒,于是就敷衍了一个O(n2)的解法。。毕竟短一些也好学一些哈。。但是我自认为解决大部分问题是没什么压力的啦。。至少比赛应该也有60吧

#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int N=20005;struct Point {double x,y;}A,B;double aa,bb,cc;int n;Point a[N*2];int m;Point b[N*2];int mm;double mu (Point x,Point y,Point z){    double x1=x.x-z.x,y1=x.y-z.y;    double x2=y.x-z.x,y2=y.y-z.y;    return x1*y2-x2*y1;}Point JD (Point x,Point y){    double t1=mu(x,B,A);    double t2=mu(y,B,A);    Point p,p1,p2;    p1=x;p2=y;    p.x=(t1*p2.x-t2*p1.x)/(t1-t2);    p.y=(t1*p2.y-t2*p1.y)/(t1-t2);    return p;}void cut ()//现在有一条有向直线A,B {    mm=0;    for (int u=1;u<=m;u++)    {        if (mu(B,a[u],A)>=0)         {            b[++mm]=a[u];//在左边            //printf("%d %d\n",u,mm);        }        else        {            if (mu(B,a[u-1],A)>0)                 b[++mm]=JD(a[u-1],a[u]);            if (mu(B,a[u+1],A)>0)                 b[++mm]=JD(a[u+1],a[u]);        }    }    for (int u=1;u<=mm;u++)        a[u]=b[u];    a[mm+1]=a[1];    a[0]=a[mm];    m=mm;}void prepare(){    m=4;    a[1].x=-100000;a[1].y=-100000;    a[2].x=100000;a[2].y=-100000;    a[3].x=100000;a[3].y=100000;    a[4].x=-100000;a[4].y=100000;    a[5]=a[1];a[0]=a[4];}int main(){/*freopen("d.in","r",stdin);    freopen("d.out","w",stdout);*/    scanf("%d",&n);    prepare();    for (int u=1;u<=n;u++)    {        scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);        cut();      //  for (int u=1;u<=m;u++)    //  printf("%lf %lf\n",a[u].x,a[u].y);      }    double ans=0;    for (int u=3;u<=m;u++)        ans=ans+mu(a[u],a[u-1],a[1]);    printf("%.1lf\n",fabs(ans)/2);    return 0;}
原创粉丝点击