hdu 1542 & & poj 1151
Atlantis
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10599 Accepted Submission(s): 4524
friend Bill has to know the total area for which maps exist. You (unwisely) volunteered to write a program that calculates this quantity.
(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.
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.
10 10 20 20
15 15 25 25.5
0
Total explored area: 180.00
Mid-Central European Regional Contest 2000
题目的大意就是给定很多矩形地图,求地图能覆盖的亚特兰蒂斯的总面积。
模仿标程写的。和之前不同,这次因为求的是笛卡尔坐标系下的长度,所以要建的是区间树,即build()修改成访问s~m和m~t,update判断标志也要改,改成l<m和m<r,我在这里卡了好久。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,len;
double yy[250];
struct Line{
int f;
double x,y1,y2;
bool operator<(const Line h)const{
return x<h.x;
}
}line[250];
struct tree{
int f;
double len;
}tr[20100];
int bin(double x)
{
int l=0,r=len;
while(l<=r){
int mid=(l+r)>>1;
if(yy[mid]==x)return mid;
if(yy[mid]<x)l=mid+1;
else r=mid-1;
}return l;
}
void pushup(int s,int t,int k)
{
if(tr[k].f)
tr[k].len=yy[t]-yy[s];
else if(s+1==t)tr[k].len=0;
else tr[k].len=tr[k<<1].len+tr[k<<1|1].len;//这里要从下向上推是因为下一次可能要用到,而要不要用考的就是f这个标记了。
}
void build(int s,int t,int k)
{
tr[k].f=tr[k].len=0;//double和int同时等于0似乎也可以,没有类型错误。
if(s+1==t)return;//这里要注意区间树的叶节点的左右边界相差1.
int m=(s+t)>>1;
build(s,m,k<<1);//因为建的是区间树,所以要s~m,m~t。
build(m,t,k<<1|1);
}
void update(int s,int t,int k,int l,int r,int f)
{
if(l<=s&&t<=r){
tr[k].f+=f;//普通的线段树覆盖操作,这里的f不再是一般的lazy标记,而是线段使用标记。
pushup(s,t,k);
return;
}int m=(s+t)>>1;
if(l<m)update(s,m,k<<1,l,r,f);//if语句就很好地表现了其区间树与线段树的不同点。
if(m<r)update(m,t,k<<1|1,l,r,f);
pushup(s,t,k);
}
int main()
{
int cas=0,m;
double x1,y1,x2,y2,ans;
while(scanf("%d",&n)&&n){
m=0;
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
yy[m]=y1;
line[m].f=1;
line[m].x=x1;
line[m].y1=y1;
line[m++].y2=y2;
yy[m]=y2;
line[m].f=-1;
line[m].x=x2;
line[m].y1=y1;
line[m++].y2=y2;
}sort(yy,yy+m);
sort(line,line+m);
len=1;
for(int i=1;i<m;i++)
if(yy[i-1]!=yy[i])yy[len++]=yy[i];
len--;
build(0,len,1);
ans=0;
for(int i=0;i<m;i++){
update(0,len,1,bin(line[i].y1),bin(line[i].y2),line[i].f);
ans+=tr[1].len*(line[i+1].x-line[i].x);
}printf("Test case #%d\nTotal explored area: %.2f\n\n",++cas,ans);//我看其他大牛的blog上写说.2f不会出错,但.2lf就会,不知道为什么。
}
return 0;
}
hdu 1542 & & poj 1151的更多相关文章
- 扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]
学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)
A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...
- ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)
●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
做这道题之前,建议先做POJ 1151 Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...
- [POJ 1151] Atlantis
一样的题:HDU 1542 Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18148 Accepted ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q16-Q18)
Question 16 You are designing a SharePoint 2010 solution to manage statements of work. You need to d ...
- Tint(着色器)的兼容实现
我们在做控件的时候可以使用tint这个属性给控件上色,这样在很多情况下能减少不同色彩的资源色彩.在MD设计中,控件颜色随着主体改变也是一大要点,今天我们就来看看如何使用它. 使用步骤:1.建立一个控件 ...
- Linux中的硬链接和软链接
软链接和硬链接 命令ln ln是创建链接的命令: 创建硬链接:ln file link 创建软链接:ln -s file link 硬链接 硬链接(hard link)是Unix系统最早的创建链接的方 ...
- 希尔排序(Shell)
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...
- Android studio 使用SVN需要忽略的文件
Android Studio创建的Android项目一般需要忽略 1..idea文件夹 2..gradle文件夹 3.所有的build文件夹 4.所有的.iml文件 5.local.propertie ...
- Android 数据库的事务
什么是数据库的事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起,并用形如begin ...
- 【代码笔记】iOS-拍照动画
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- iOS带动画的环形进度条(进度条和数字同步)
本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...
- 学习Coding-iOS开源项目日志(一)
前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了 ...
- 详解DB2 sqlstate 57016 原因码 "7"错误