zoukankan      html  css  js  c++  java
  • 【POJ】1389 Area of Simple Polygons

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #define MAXN 100010
      5 struct Line
      6 {
      7     int left,right,high,flag;
      8 };
      9 struct node
     10 {
     11     int sum,cover;
     12 };
     13 Line p[MAXN];
     14 node tree[MAXN<<2];
     15 int x[MAXN];
     16 inline bool Out(int x1,int y1,int x2,int y2)
     17 {
     18     return x1==-1&&y1==-1&&x2==-1&&y2==-1;
     19 }
     20 int cmp1(const void *a,const void *b)
     21 {
     22     return *(int *)a-*(int *)b;
     23 }
     24 int cmp2(const void *a,const void *b)
     25 {
     26     return (*(Line *)a).high-(*(Line *)b).high;
     27 }
     28 int Bin(int val,int low,int high)
     29 {
     30     int mid;
     31     while(low<high)
     32     {
     33         mid=(low+high)>>1;
     34         if(x[mid]==val)
     35             return mid;
     36         if(x[mid]<val)
     37             low=mid+1;
     38         else
     39             high=mid;
     40     }
     41 }
     42 void Build(int L,int R,int rt)
     43 {
     44     tree[rt].cover=tree[rt].sum=0;
     45     if(L!=R)
     46     {
     47         int mid=(L+R)>>1;
     48         Build(L,mid,rt<<1);
     49         Build(mid+1,R,rt<<1|1);
     50     }
     51 }
     52 inline void PushUp(int L,int R,int rt)
     53 {
     54     if(tree[rt].cover)
     55         tree[rt].sum=x[R+1]-x[L];
     56     else if(L==R)
     57         tree[rt].sum=0;
     58     else
     59         tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
     60 }
     61 void Update(int st,int en,int flag,int L,int R,int rt)
     62 {
     63     if(st<=L&&R<=en)
     64     {
     65         tree[rt].cover+=flag;
     66         PushUp(L,R,rt);
     67     }
     68     else
     69     {
     70         int mid=(L+R)>>1;
     71         if(mid>=st)
     72             Update(st,en,flag,L,mid,rt<<1);
     73         if(en>mid)
     74             Update(st,en,flag,mid+1,R,rt<<1|1);
     75         PushUp(L,R,rt);
     76     }
     77 }
     78 int main()
     79 {
     80     int n,i,m,flag,x1,y1,x2,y2,ans,st,en;
     81     for(n=flag=0;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);)
     82     {
     83         if(Out(x1,y1,x2,y2))
     84             flag++;
     85         else
     86             flag=0;
     87         if(flag==2)
     88             break;
     89         if(flag)
     90         {
     91             qsort(x,n,sizeof(x[0]),cmp1);
     92             qsort(p,n,sizeof(p[0]),cmp2);
     93             for(i=m=0;i<n;i++)
     94             {
     95                 if(x[i]!=x[m])
     96                     x[++m]=x[i];
     97             }
     98             Build(0,m-1,1);
     99             for(i=ans=0;i<n-1;i++)
    100             {
    101                 st=Bin(p[i].left,0,m+1);
    102                 en=Bin(p[i].right,0,m+1);
    103                 Update(st,en-1,p[i].flag,0,m-1,1);
    104                 ans+=(p[i+1].high-p[i].high)*tree[1].sum;
    105             }
    106             printf("%d\n",ans);
    107             n=0;
    108         }
    109         else
    110         {
    111             x[n]=x1;
    112             p[n].flag=1;
    113             p[n].left=x1;
    114             p[n].right=x2;
    115             p[n++].high=y1;
    116             x[n]=x2;
    117             p[n].flag=-1;
    118             p[n].left=x1;
    119             p[n].right=x2;
    120             p[n++].high=y2;
    121         }
    122     }
    123     return 0;
    124 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    详解 Python3 正则表达式(四)
    详解 Python3 正则表达式(一)
    Python之禅
    人生感悟
    详解 Python3 正则表达式(五)
    作用域与带有循环变量的默认参数相比较问题
    详解 Python3 正则表达式(三)
    python学习笔记:第三天(数字)
    python学习笔记:第四天( 字符串)
    python学习笔记:第二天(基本数据类型)
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2531315.html
Copyright © 2011-2022 走看看