hnu12884 Area Coverage 矩形分割 or 线段树

题意:给你n个二维平面上的矩形,可以两两覆盖,问最后覆盖的总面积为多少

解题思路:1)矩形状分割,可以知道,每多出一个矩形就和前面所有产生的矩形判断,看是有相交,如果有的话,就对前面的矩形进行分割,最多可以分割成8块,因为这个算法是n×n的算法时间复杂度,所以我们还需要在枚举的时候加速,采用引导值(下一个不为0的矩阵的值),最后6700ms过了

解题代码:

  1 // File Name: rect1.c
  2 // Author: darkdream
  3 // Created Time: 2014年02月20日 星期四 20时32分02秒
  4 /*
  5 ID: dream.y1
  6 PROG: rect1
  7 LANG: C++
  8 */
  9 #include<stdio.h>
 10 #include<string.h>
 11 #include<stdlib.h>
 12 #include<time.h>
 13 #include<math.h>
 14 #define LL long long
 15 struct node{
 16     int lx,ly,rx,ry;
 17 }a[30000];
 18 int A, B,k;
 19 int isin(struct node temp,int  x,int y)
 20 {
 21     if( x >= temp.lx && x <= temp.rx && y >= temp.ly && y <= temp.ry)
 22         return 1;
 23     return 0 ;
 24 }
 25 int t = 0;
 26 LL isaren(int i)
 27 {
 28     if(a[i].lx != -1)
 29        return 1ll*(a[i].rx - a[i].lx +1) * (a[i].ry - a[i].ly +1) ;
 30     else return 0 ;
 31 }
 32 void fun0(struct node p ,struct node q)
 33 {
 34     return ;
 35 }
 36 void fun1(struct node p,struct node q)
 37 {
 38     t ++ ;
 39     a[t].lx = q.lx ;
 40     a[t].ly = p.ry +1;
 41     a[t].rx = p.lx -1;
 42     a[t].ry = q.ry;
 43     if(isaren(t) <= 0)
 44         t--;
 45 }
 46 void fun2(struct node p,struct node q)
 47 {
 48     t ++ ;
 49     a[t].lx = p.lx ;
 50     a[t].ly = p.ry +1;
 51     a[t].rx = p.rx;
 52     a[t].ry = q.ry;
 53     if(isaren(t) <= 0)
 54         t--;
 55
 56 }
 57 void fun3(struct node p,struct node q)
 58 {
 59     t ++ ;
 60     a[t].lx = p.rx +1 ;
 61     a[t].ly = p.ry +1 ;
 62     a[t].rx = q.rx;
 63     a[t].ry = q.ry;
 64     if(isaren(t) <= 0)
 65         t--;
 66
 67 }
 68 void fun4(struct node p,struct node q)
 69 {
 70     t ++ ;
 71     a[t].lx = q.lx ;
 72     a[t].ly = p.ly;
 73     a[t].rx = p.lx-1;
 74     a[t].ry = p.ry;
 75     if(isaren(t) <= 0)
 76         t--;
 77 }
 78 void fun5(struct node p,struct node q)
 79 {
 80     t ++ ;
 81     a[t].lx = p.rx +1 ;
 82     a[t].ly = p.ly;
 83     a[t].rx = q.rx;
 84     a[t].ry = p.ry;
 85     if(isaren(t) <= 0)
 86         t--;
 87
 88 }
 89 void fun6(struct node p,struct node q)
 90 {
 91     t ++ ;
 92     a[t].lx = q.lx ;
 93     a[t].ly = q.ly;
 94     a[t].rx = p.lx - 1;
 95     a[t].ry = p.ly - 1;
 96     if(isaren(t) <= 0)
 97         t--;
 98 }
 99 void fun7(struct node p,struct node q)
100 {
101     t ++ ;
102     a[t].lx = p.lx ;
103     a[t].ly = q.ly;
104     a[t].rx = p.rx;
105     a[t].ry = p.ly - 1;
106     if(isaren(t) <= 0)
107         t--;
108
109 }
110 void fun8(struct node p,struct node q)
111 {
112     t ++ ;
113     a[t].lx = p.rx + 1 ;
114     a[t].ly = q.ly;
115     a[t].rx = q.rx;
116     a[t].ry = p.ly -1;
117     if(isaren(t) <= 0)
118         t--;
119
120 }
121 LL ans = 0;
122 void figu()
123 {
124     for(int  i = 1;i <= t;i ++)
125     {
126         if(isaren(i) >= 1)
127         {
128         //    printf("%d %d %d %d\n",a[i].lx,a[i].ly,a[i].rx,a[i].ry);
129             ans+= isaren(i);
130         }
131     }
132     printf("%I64d\n",ans);
133 }
134 int lastjudge(node tn1,node tn2)
135 {
136     if(tn1.lx >= tn2.lx && tn1.lx <= tn2.rx && tn1.rx >= tn2.lx && tn1.rx <= tn2.rx && tn1.ly < tn2.ly && tn1.ry > tn2.ry)
137         return 1;
138     if(tn1.ly >= tn2.ly && tn1.ly <= tn2.ry && tn1.ry >= tn2.ly && tn1.ry <= tn2.ry && tn1.lx < tn2.lx && tn1.rx > tn2.rx)
139         return 1;
140     return 0 ;
141 }
142 int next[30004];
143 int main(){
144     int ca;
145     scanf("%d",&ca);
146     while(ca--)
147     {
148         ans = 0 ;
149         t = 0 ;
150         scanf("%d",&k);
151         for(int i = 1;i <= 30000;i ++)
152             next[i] = i+1;
153         for(int i = 1 ;i <= k;i ++)
154         {
155             t ++ ;
156             scanf("%d %d %d %d",&a[t].lx,&a[t].ly,&a[t].rx,&a[t].ry);
157             a[t].rx -- ;
158             a[t].ry --;
159             int limit = t ;
160             int tnext  = 1;
161             for(int j = 1;j < limit ;)
162             {
163                 //printf("%d\n",j);
164                 //printf("%d\n",j);
165                 if(j == 0 )
166                     break;
167                 struct node tn1,tn2;
168                 tn1 = a[limit];
169                 tn2 = a[j];
170                 if(isin(tn2,tn1.lx,tn1.ly) || isin(tn2,tn1.rx,tn1.ry) || isin(tn2,tn1.lx,tn1.ry) || isin(tn2,tn1.rx,tn1.ly)||isin(tn1,tn2.lx,tn2.ly) || isin(tn1,tn2.rx,tn2.ry) || isin(tn1,tn2.lx,tn2.ry) || isin(tn1,tn2.rx,tn2.ly)||lastjudge(tn1,tn2))
171                 {
172                     a[j].lx = a[j].ly = a[j].rx = a[j].ry = -1;
173                     int hs[10];
174                     memset(hs,0,sizeof(hs));
175                     if(tn1.lx >= tn2.lx  && tn1.lx <= tn2.rx)
176                     {
177                         hs[6] = 1;
178                         hs[7] = 1;
179                         hs[8] = 1;
180                     }else tn1.lx = tn2.lx;
181
182                     if(tn1.rx >= tn2.lx  && tn1.rx <= tn2.rx)
183                     {
184                         hs[1] = 1;
185                         hs[2] = 1;
186                         hs[3] = 1;
187                     }else tn1.rx = tn2.rx;
188
189                     if(tn1.ly >= tn2.ly  && tn1.ly <= tn2.ry)
190                     {
191                         hs[1] = 1;
192                         hs[4] = 1;
193                         hs[6] = 1;
194                     }else tn1.ly = tn2.ly;
195
196                     if(tn1.ry >= tn2.ly  && tn1.ry <= tn2.ry)
197                     {
198                         hs[3] = 1;
199                         hs[5] = 1;
200                         hs[8] = 1;
201                     }else tn1.ry = tn2.ry;
202                     //     printf("(((((((%d %d %d %d %d\n%d %d %d %d %d))))))\n",tn1.lx,tn1.ly,tn1.rx,tn1.ry,tn1.c,tn2.lx,tn2.ly,tn2.rx,tn2.ry,tn2.c);
203                     void (*p[])(node,node) = {fun0,fun1,fun2,fun3,fun4,fun5,fun6,fun7,fun8};
204                     for(int s =1 ;s <= 8 ;s ++)
205                     {
206                         p[s](tn1,tn2);
207                     }
208                 }
209                 if(isaren(j) > 0 && j != 1)
210                 {
211                    next[tnext] = j ;
212                    tnext = j;
213                 }
214                 j = next[j];
215             }
216         }
217         figu();
218     }
219     return 0 ;
220 }

2)还可以用线段树来求解这题

hnu12884 Area Coverage 矩形分割 or 线段树

时间: 2024-11-04 07:36:38

hnu12884 Area Coverage 矩形分割 or 线段树的相关文章

poj-1151矩形面积并-线段树

title: poj-1151矩形面积并-线段树 date: 2018-10-30 22:35:11 tags: acm 刷题 categoties: ACM-线段树 概述 线段树问题里的另一个问题,,,矩形面积并,,,, 之前看lazy更新时看到下面这个的讲解,,,一大堆文字还有一大堆的图,,,,当时果断跳过,,, 今天花了一下午加一晚上的时间看了看这块知识,,,然后尝试自己写出代码,,,算是简单的了解一下这块,,, 题意 这道矩形面积并问题的大意是给很多个矩形,,矩形之间可能有交集,,,然后

【POJ 1389】Area of Simple Polygons(线段树+扫描线,矩形并面积)

离散化后,[1,10]=[1,3]+[6,10]就丢了[4,5]这一段了. 因为更新[3,6]时,它只更新到[3,3],[6,6]. 要么在相差大于1的两点间加入一个值,要么就让左右端点为l,r的线段树节点表示到x[l]到x[r+1]的区间. 这样tree[l,r]=tree[l,m]+tree[m+1,r]=[x[l],x[m+1]]+[x[m+1],x[r+1]] #include<iostream> #include<algorithm> #include<cstdio

POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]

Atlantis Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21734   Accepted: 8179 Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of

POJ 1389 Area of Simple Polygons 扫描线+线段树面积并

---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 同1151.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <stdio.h> #include

POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)

题目链接: http://poj.org/problem?id=2104 解题思路: 因为查询的个数m很大,朴素的求法无法在规定时间内求解.因此应该选用合理的方式维护数据来做到高效地查询. 如果x是第k个数,那么一定有 (1)在区间中不超过x的数不少于k个 (2)在区间中小于x的数有不到k个 因此,如果可以快速求出区间里不超过x的数的个数,就可以通过对x进行二分搜索来求出第k个数是多少. 接下来,我们来看一下如何计算在某个区间里不超过x个数的个数.如果不进行预处理,那么就只能遍历一遍所有元素.

hdu1255 覆盖的面积 线段树-扫描线

矩形面积并 线段树-扫描线裸题 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 const int maxm=2e3+5; 7 const double eps=1e-5; 8 9 struct seg{ 10 double x,y1,y2; 11 int c; 12 bool operator

线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage

Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 16, Accepted users: 12 Problem 12884 : No special judgement Problem description In this day and age, a lot of the spying on other countries is done

ZOJ1659_Mobile Phone Coverage(扫描线/线段树+离散)

解题报告 题目传送门 题意: 求矩形面积并 思路: 扫描线+线段树.要离散化,坐标是浮点型的. 对于线段树(区间)与点坐标对应起来可以这样 区间[1,4]对应的线段树. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct Seg { int v; double lx,rx,h; friend bool

hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> #include <algorithm> #define MAXN 110 #define LL ((rt<<1)+1) #define RR ((rt<<1)+2) using namespace std; int n; struct segment{ double l