这题我先是用离散化做了下,发现可以过,时间当然要久点。在离散化中有这样一个概念:超元线段。这些线段将平面分割成
大小不相当(或相等)的矩形,这些矩形的边要么是给定矩形的边的一部份要么完全和给定矩形无关。我们只有按给定矩形的顶点
的x坐标,y坐标分别画出垂直x轴,y轴的直线,用这些直线来分割平面,它们相交得到的线段就是超元线段。只有统计出超元线段
出现的次数矩形的总周长就可以算到了。
- /*pku1177
- Name: Picture
- Date: 29-07-08 13:52
- Description: 计算几何,离散化后求周长
- */
- #include<stdio.h>
- #include<algorithm>
- #define pr printf
- int x[10002],y[10002];
- int a[5002][4];
- int A[10002],n;
- int cmp(const void * a,const void *b)
- {
- return *(int *)a-*(int * )b;
- }
- int search_bin(int *t,int k,int start,int end)
- {
- int low=start,high=end-1,mid;
- while (low<=high)
- {
- mid=(low+high)/2;
- if (k==t[mid]) return mid;
- else if (k<t[mid]) high=mid-1;
- else low=mid+1;
- }
- return -1;
- }
- void count_x(int index){
- int i,x1=x[index],x2=x[index+1];
- int y1,y2;
- for(i=0;i<n;i++)
- if(a[i][0]<=x1 && a[i][2]>=x2){//这个矩形跨越了该原线段
-
- A[y1=search_bin(y,a[i][3],0,2*n)]++;
- A[y2=search_bin(y,a[i][1],0,2*n)]--;
- }
- }
- void count_y(int index){
- int i,y1=y[index],y2=y[index+1];
- for(i=0;i<n;i++)
- if(a[i][1]<=y1 && a[i][3]>=y2){//这个矩形跨越了该原线段
- A[search_bin(x,a[i][2],0,2*n)]++;
- A[search_bin(x,a[i][0],0,2*n)]--;
- }
- }
- int add(){//该超元线段出现次数
- int i,sum,ad;
- sum=0;ad=0;
- for(i=0;i<2*n;i++)
- {
- if(A[i]!=0)
- {
- if(ad==0)sum++;
- ad+=A[i];
- if(ad==0)sum++;
- }
-
- }
- return sum;
- }
- int main(){
- int i,j,k,v1,v2,h2,h1;
- scanf("%d",&n);
- for(i=0,k=0;i<n;i++,k++)
- {
- scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
- x[k]=a[i][0],y[k]=a[i][1],x[++k]=a[i][2],y[k]=a[i][3];
- }
- qsort(x,2*n,sizeof(int),cmp);
- qsort(y,2*n,sizeof(int),cmp);
- int ans=0,len,tmp;
- for(i=0;i<2*n-1;i++)//横线的超元线段
- {
- len=x[i+1]-x[i];
- if(len==0)continue;
- for(j=0;j<2*n;j++)A[j]=0;
- count_x(i);
- tmp=add();
- ans+=(tmp*len);
- }
- for(i=0;i<2*n-1;i++)//竖线的超元线段
- {
- for(j=0;j<2*n;j++)A[j]=0;
- len=y[i+1]-y[i];
- if(len==0)continue;
- count_y(i);
- tmp=add();
- ans+=(tmp*len);
- }
- pr("%d/n",ans);
- }
- /*
- 2
- 4 2 10 9
- 6 5 15 13
- 44
- 3
- -15 0 5 10
- -5 8 20 25
- 15 -4 24 14
- */
pku1177 Picture(矩形外围总周长)
最新推荐文章于 2017-12-09 13:36:36 发布
这篇博客介绍了如何使用计算几何方法解决求解一组矩形外围总周长的问题。通过离散化坐标,然后对每个横线和竖线进行处理,计算超元线段的出现次数,最后得到总周长。代码中使用了搜索和排序等算法。
摘要由CSDN通过智能技术生成