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 ...
随机推荐
- Android自定义ScrollView分段加载大文本数据到TextView
以下内容为原创,转载时请注明链接地址:http://www.cnblogs.com/tiantianbyconan/p/3311658.html 这是我现在碰到的一个问题,如果需要在TextView中 ...
- Android 从Gallery获取图片
本文主要介绍Android中从Gallery获取图片 设计项目布局 <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- iOS开发-完整学习路线图
- 坑!坑!坑!防不胜防的unsigned int的运算
我很早之前就知道,unsigned int与int运算的时候,int会被转化为unsigned int来进行运算.一直觉得定这条规则的人是极度反人类的,虽说unsigned int可以表示更大的正值, ...
- php 操作mysql 分表的一种方法
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAARUAAAHXCAIAAAAdrFkKAAAgAElEQVR4nOyd61sTx9//+4fcj+6H95
- 【转】JAVA 8 日期/时间(Date Time)API指南
前言 本来想写下Java 8的日期/时间API,发现已经有篇不错的文章了,那就直接转载吧~ PS:主要内容没变,做了部分修改. 原文链接: journaldev 翻译: ImportNew.com - ...
- 修改Mac系统的默认截图保存路径到指定目录
注:此文仅针对mac系统如果你是mac用户,会发现桌面经常一团糟,桌面到处都是平时的截图(mac系统的截图是command+shift+3 和 command+shift+4 两个快捷命令) 之前一直 ...
- 一次进程hang住问题分析。。。
这两天有同学使用数据校验工具时发现进程hang住了,也不知道什么原因,我简单看了看进程堆栈,问题虽然很简单,但能导致程序hang住,也一定不是小问题.简单说明下程序组件的结构,程序由两部分构成,dbc ...
- 最近用Timer踩了一个坑,分享一下避免别人继续踩
最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能, ...
- Java设计模式 - 观察者模式
定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1. 主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...