hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11777 Accepted Submission(s): 4983
fabled island Atlantis. Some of these texts even include maps of parts of
the island. But unfortunately, these maps describe different regions of
Atlantis. Your friend Bill has to know the total area for which maps exist.
You (unwisely) volunteered to write a program that calculates this quantity.
line containing a single integer n (1<=n<=100) of available maps. The n
following lines describe one map each. Each of these lines contains four
numbers x1;y1;x2;y2 (0<=x1<x2<=100000;0<=y1<y2<=100000), not necessarily
integers. The values (x1; y1) and (x2;y2) are the coordinates of the
top-left resp. bottom-right corner of the mapped area.
The input file is terminated by a line containing a single 0. Don’t process
it.
of each section must be “Test case #k”, where k is the number of the test
case (starting with 1). The second one must be “Total explored area: a”,
where a is the total explored area (i.e. the area of the union of all
rectangles in this test case), printed exact to two digits to the right of
the decimal point.
Output a blank line after each test case.
【题意】:
给你n个矩形的左下角(x1,y1),右上角(x2,y2),让你求n个矩形面积的并
【分析】:见这里
【代码】:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define m(s) memset(s,0,sizeof s)
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=1e5+;
struct node{
double xl,xr,h;
int id;
bool operator < (const node &a)const{
return h<a.h;
}
}b[N];
int n,kase,tag[N<<];
double sum[N<<],c[N];
void updata(int k,int l,int r){
if(tag[k]) sum[k]=c[r+]-c[l];//当前区间被线段覆盖
else if(l==r) sum[k]=;//已经到了叶子结点且没有被覆盖
else sum[k]=sum[lc]+sum[rc];// 没有完全被覆盖,但是还没到叶子结点,从其子区间中获得信息
}
void change(int k,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
tag[k]+=val;updata(k,l,r);
return ;
}
int mid=l+r>>;
if(x<=mid) change(lc,l,mid,x,y,val);
if(y>mid) change(rc,mid+,r,x,y,val);
updata(k,l,r);
}
int main(){
while(~scanf("%d",&n)&&n){
int cnt=;double ans=;
double x1,x2,y1,y2;
m(sum);m(tag);
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
}
sort(b+,b+cnt+);
sort(c+,c+cnt+);
int t=unique(c+,c+cnt+)-(c+);
for(int i=;i<cnt;i++){
x1=lower_bound(c+,c+t+,b[i].xl)-c;
x2=lower_bound(c+,c+t+,b[i].xr)-c-;
change(,,t,x1,x2,b[i].id);
ans+=(b[i+].h-b[i].h)*sum[];
}
printf("Test case #%d\n",++kase);
printf("Total explored area: %.2f\n\n",ans);
}
return ;
}
/*
奉送一组数据
输入:
3
10 10 20 20
15 15 25 30
22 8 28 17 输出:
Test case #1
Total explored area: 273.00
再送大家一道题:poj 1389
整体思路一模一样,只是一个为整数,一个为实数,输入输出格式不一样。。
*/
-------------------------------------
-------------------------------------
poj 1389
#include<cstdio>
#include<cstring>
#include<algorithm>
#define m(s) memset(s,0,sizeof s)
#define lc k<<1
#define rc k<<1|1
using namespace std;
const int N=1e5+;
struct node{
int xl,xr,h;
int id;
bool operator < (const node &a)const{
return h<a.h;
}
}b[N];
int n,kase,tag[N<<];
int sum[N<<],c[N];
void updata(int k,int l,int r){
if(tag[k]) sum[k]=c[r+]-c[l];
else if(l==r) sum[k]=;
else sum[k]=sum[lc]+sum[rc];
}
void change(int k,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
tag[k]+=val;updata(k,l,r);
return ;
}
int mid=l+r>>;
if(x<=mid) change(lc,l,mid,x,y,val);
if(y>mid) change(rc,mid+,r,x,y,val);
updata(k,l,r);
}
int main(){
int x1,x2,y1,y2;
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2),~x1){
int cnt=,ans=;m(sum);m(tag);
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2),~x1){
b[++cnt]=(node){x1,x2,y1,};c[cnt]=x1;
b[++cnt]=(node){x1,x2,y2,-};c[cnt]=x2;
}
sort(b+,b+cnt+);
sort(c+,c+cnt+);
int t=unique(c+,c+cnt+)-(c+);
for(int i=;i<cnt;i++){
x1=lower_bound(c+,c+t+,b[i].xl)-c;
x2=lower_bound(c+,c+t+,b[i].xr)-c-;
change(,,t,x1,x2,b[i].id);
ans+=(b[i+].h-b[i].h)*sum[];
}
printf("%d\n",ans);
}
return ;
}
hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]的更多相关文章
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- POJ 1151 - Atlantis 线段树+扫描线..
离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
- poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- POJ 1151 Atlantis 线段树+离散化+扫描线
这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
随机推荐
- uva 103 Stacking Boxes(最长上升子序列)
Description Stacking Boxes Background Some concepts in Mathematics and Computer Science are simp ...
- uva 12723 概率dp
Dudu is a very starving possum. He currently stands in the first shelf of a fridge. This fridge isco ...
- HibernateException: No Hibernate Session bound to thread
解决No Hibernate Session bound to thread 背景交代 在使用this.getHibernateTemplate().getSessionFactory().getCu ...
- 论epoll的实现
论epoll的实现 上一篇博客 论select的实现 里面已经说了为什么 select 比较慢.poll 的实现和 select 类似,只是少了最大 fd 限制,如果有兴趣可以自己去看代码.我这里来简 ...
- 2016-2017 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2016)
题目链接 Codefores_Gym_101164 Solved 6/11 Penalty Problem A Problem B Problem C Problem D Problem E Pr ...
- jenkins的Pipeline代码流水线管理
1.新建一个pipline任务 2.自写一个简单的pipline脚本 a.Pipeline的脚本语法在Pipeline Syntax中,片段生成器,示例步骤中选择builf:Build a job b ...
- luogu P1922 女仆咖啡厅桌游吧
题目背景 小v带萌萌的妹妹去玩,妹妹想去女仆咖啡馆,小v想去桌游吧. 妹妹:“我问你个问题,答不对你就做我一天的奴隶,答对了就今天我就全部听你的.” 小v:“全部都听!?” 妹妹:“嘻嘻嘻,你还是回答 ...
- DBUtils工具类学习一
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能 1.特征 DBUtils是java编程中 ...
- JDK1.8和Spring 3.2.0 的坑
上午 org.apache.catalina.core.StandardContext listenerStart严重: Exception sending context initialized e ...
- 将可执行程序的内存空间扩展到3GB(windows)
为了告知操作系统这个应用程序可以支持/3GB方式,我们需要往exe 文件头中添加一个 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志.添加的方式很简单: 在你的系统的 Progra ...