• 【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
  • 相关阅读:
    ES 入门记录之 match和term查询的区别
    ElasticSearch 学习记录之Text keyword 两种基本类型区别
    ES 记录之如何创建一个索引映射,以及一些设置
    娱乐至死 读书笔记
    ES 入门之一 安装ElasticSearcha
    王二的经济学故事 读书笔记
    redis特性 存储 API 集群 等
    Linux 卸载 openjdk
    Linux 下面解压.tar.gz 和.gz文件解压的方式
    本地连接 vmware服务器
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2531315.html
Copyright © 2020-2023  润新知