栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 2093 Cutting Edge

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 2093 Cutting Edge

#include<iostream>#include<cstdlib>#include<stdio.h>#include<algorithm>#include<cmath>#include<cstring>using namespace std;struct rec{    int x1,y1,x2,y2,dx1,dy1,dx2,dy2;    bool operator <(const rec &temp)const    {         if(dx1==temp.dx1) return dy1<temp.dy1;         return dx1<temp.dx1;    }};rec a[2200],ans[2200],heap[100000];int n,res,size;int list[2][10000],num[2],cnt[2],ax[2],in[2],cont[2][4000],ncnt[2][4000];struct segment{    int va1,va2;    bool operator <(const segment &temp)const    {         return va1<temp.va1;    }};segment seg[2][4000][1000];void min_heapify(int id){     int ii=(id-1)/2;     if(id&&heap[id]<heap[ii])     {         swap(heap[id],heap[ii]);         min_heapify(ii);     }}void heapify(int id){     int l=2*id+1,r=2*id+2,ii=id;     if(l<size&&heap[l]<heap[ii])        ii=l;     if(r<size&&heap[r]<heap[ii])        ii=r;     if(ii!=id)     {        swap(heap[ii],heap[id]);        heapify(ii);     }}int binary(int left,int right,int list[],int value){    int mid;    while(left<=right)    {        mid=(left+right)/2;        if(list[mid]<value)left=mid+1;        else if(list[mid]>value)right=mid-1;        elsereturn mid;    }}void add(){     int i,j,s,p,q,id1,id2;     heap[size].dx1=heap[size].dy1=1000000000;     id1=binary(0,cnt[0]-1,list[0],heap[size].x1);     id2=binary(0,cnt[0]-1,list[0],heap[size].x2);      for(j=id1+1;j<=id2-1;j++)     {        for(s=0;s<cont[0][j];s++)        {  if(seg[0][j][s].va1<=heap[size].y1&&seg[0][j][s].va2>=heap[size].y2) {      if(heap[size].dx1>list[0][j])      {          heap[size].dx1=heap[size].dx2=list[0][j];          heap[size].dy1=heap[size].y1;          heap[size].dy2=heap[size].y2;      }      else if(heap[size].dx1==list[0][j])      {          if(heap[size].dy1>heap[size].y1)          {   heap[size].dy1=heap[size].y1;   heap[size].dx2=list[0][j];   heap[size].dy2=heap[size].y2;          }      } }        }     }     id1=binary(0,cnt[1]-1,list[1],heap[size].y1);     id2=binary(0,cnt[1]-1,list[1],heap[size].y2);     for(j=id1+1;j<=id2-1;j++)     {         for(s=0;s<cont[1][j];s++)         {  if(seg[1][j][s].va1<=heap[size].x1&&seg[1][j][s].va2>=heap[size].x2)  {         if(heap[size].dx1>heap[size].x1)        {heap[size].dx1=heap[size].x1;heap[size].dy1=heap[size].dy2=list[1][j];heap[size].dx2=heap[size].x2;        }        else if(heap[size].dx1==heap[size].x1)        { if(heap[size].dy1>list[1][j]) {    heap[size].dy1=heap[size].dy2=list[1][j];    heap[size].x2=heap[size].x2; }        }  }         }     }      size++;     min_heapify(size-1);}void run(){     int i,j,s,p,q;     rec u;     size=0;     heap[0].x1=in[0];     heap[0].y1=in[1];     heap[0].x2=ax[0];     heap[0].y2=ax[1];     add();     while(size)     {         if(heap[0].dx1==1000000000)  break;         printf("%d %d %d %dn",heap[0].dx1,heap[0].dy1,heap[0].dx2,heap[0].dy2);         u=heap[0];         heap[0]=heap[size-1];         size--;         heapify(0);         if(u.dx1==u.dx2)         { heap[size].x1=u.x1; heap[size].y1=u.y1; heap[size].x2=u.dx1; heap[size].y2=u.y2; add(); heap[size].x1=u.dx1; heap[size].y1=u.y1; heap[size].x2=u.x2; heap[size].y2=u.y2; add();         }         else         {  heap[size].x1=u.x1;  heap[size].y1=u.y1;  heap[size].x2=u.x2;  heap[size].y2=u.dy1;  add();  heap[size].x1=u.x1;  heap[size].y1=u.dy1;  heap[size].x2=u.x2;  heap[size].y2=u.y2;  add();         }     }}int main(){    int i,j,s,p,q,id,xid1,xid2,yid1,yid2,max,tst=0;    while(scanf("%d",&n)&&n)    {        tst++;        num[0]=num[1]=0;        ax[0]=ax[1]=-1000000000;        in[0]=in[1]=1000000000;        for(i=0;i<n;i++)        {scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);if(a[i].x1<in[0])   in[0]=a[i].x1;if(a[i].x2>ax[0])   ax[0]=a[i].x2;if(a[i].y1<in[1])   in[1]=a[i].y1;if(a[i].y2>ax[1])   ax[1]=a[i].y2;list[0][num[0]++]=a[i].x1;list[0][num[0]++]=a[i].x2;list[1][num[1]++]=a[i].y1;list[1][num[1]++]=a[i].y2;        }        if(tst>1)printf("n");        for(i=0;i<2;i++)        {sort(list[i],list[i]+num[i]);cnt[i]=1;for(j=1;j<num[i];j++){    if(list[i][j]!=list[i][cnt[i]-1])       list[i][cnt[i]++]=list[i][j];}        }        memset(cont,0,sizeof(cont));        for(i=0;i<n;i++)        {  xid1=binary(0,cnt[0]-1,list[0],a[i].x1);  xid2=binary(0,cnt[0]-1,list[0],a[i].x2);  yid1=binary(0,cnt[1]-1,list[1],a[i].y1);  yid2=binary(0,cnt[1]-1,list[1],a[i].y2);  seg[0][xid1][cont[0][xid1]].va1=a[i].y1;  seg[0][xid1][cont[0][xid1]++].va2=a[i].y2;  seg[0][xid2][cont[0][xid2]].va1=a[i].y1;  seg[0][xid2][cont[0][xid2]++].va2=a[i].y2;  seg[1][yid1][cont[1][yid1]].va1=a[i].x1;   seg[1][yid1][cont[1][yid1]++].va2=a[i].x2;  seg[1][yid2][cont[1][yid2]].va1=a[i].x1;  seg[1][yid2][cont[1][yid2]++].va2=a[i].x2;         }          for(i=0;i<2;i++)          for(j=0;j<cnt[i];j++) while(cont[i][j]>1000);        for(i=0;i<2;i++)        {for(j=0;j<cnt[i];j++){    sort(seg[i][j],seg[i][j]+cont[i][j]);    ncnt[i][j]=0;    max=seg[i][j][0].va2;    for(s=1;s<cont[i][j];s++)    {        if(max<seg[i][j][s].va1)        { seg[i][j][ncnt[i][j]++].va2=max; seg[i][j][ncnt[i][j]].va1=seg[i][j][s].va1;        }        if(max<seg[i][j][s].va2) max=seg[i][j][s].va2;    }    seg[i][j][ncnt[i][j]++].va2=max;    cont[i][j]=ncnt[i][j];}        }        run();    }        return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号