Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC贴代码Source Code Problem: 2093 User: JiaJunpeng Memory: 9888K Time: 266MS Language: C++ Result: Accepted Source Code #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; else return 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 %d\n",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; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator