hdu 1542 Atlantis
求矩形的面积之和。
线段树+离散话+扫描线
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std; const int MAX=+;
int mark[MAX<<];//记录某个区间的下底边个数
double sum[MAX<<];//记录某个区间的下底边总长度
double lisan[MAX];//对x进行离散化,否则x为浮点数且很大无法进行线段树 //以横坐标作为线段(区间),对横坐标线段进行扫描
//扫描的作用是每次更新下底边总长度和下底边个数,增加新面积
struct seg{//线段
double l,r,h;
int d;
seg(){}
seg(double x1,double x2,double H,int c):l(x1),r(x2),h(H),d(c){}
bool operator<(const seg &a)const{
return h<a.h;
}
}s[MAX]; void Upfather(int n,int left,int right){
if(mark[n])sum[n]=lisan[right+]-lisan[left];//表示该区间整个线段长度可以作为底边
else if(left == right)sum[n]=;//叶子结点则底边长度为0(区间内线段长度为0)
else sum[n]=sum[n<<]+sum[n<<|];
} void Update(int L,int R,int d,int n,int left,int right){
if(L<=left && right<=R){//该区间是当前扫描线段的一部分,则该区间下底边总长以及上下底边个数差更新
mark[n]+=d;//更新底边相差差个数
Upfather(n,left,right);//更新底边长
return;
}
int mid=left+right>>;
if(L<=mid)Update(L,R,d,n<<,left,mid);
if(R>mid)Update(L,R,d,n<<|,mid+,right);
Upfather(n,left,right);
} int search(double key,double* x,int n){
int left=,right=n-;
while(left<=right){
int mid=left+right>>;
if(x[mid] == key)return mid;
if(x[mid]>key)right=mid-;
else left=mid+;
}
return -;
} int main(){
int n,num=;
double x1,x2,y1,y2;
while(cin>>n,n){
int k=;
for(int i=;i<n;++i){
cin>>x1>>y1>>x2>>y2;
lisan[k]=x1;
s[k++]=seg(x1,x2,y1,);
lisan[k]=x2;
s[k++]=seg(x1,x2,y2,-);
}
sort(lisan,lisan+k);
sort(s,s+k);
int m=;
for(int i=;i<k;++i)//去重复端点
if(lisan[i] != lisan[i-])lisan[m++]=lisan[i];
double ans=;
//memset(mark,0,sizeof mark);
//memset(sum,0,sizeof sum);//如果下面是i<k-1,则要初始化,因为如果对第k-1条,线段扫描时会使得mark,sum为0才不用初始化的
for(int i=;i<k;++i){//扫描线段
int L=search(s[i].l,lisan,m);
int R=search(s[i].r,lisan,m)-;
Update(L,R,s[i].d,,,m-);//扫描线段时更新底边长度和底边相差个数
ans+=sum[]*(s[i+].h-s[i].h);//新增加面积
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++num,ans);
}
return ;
}
hdu 1542 Atlantis的更多相关文章
- (HDU 1542) Atlantis 矩形面积并——扫描线
n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...
- HDU 1542 Atlantis(矩形面积并)
HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 1542 Atlantis(扫描线算法)
题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1542 Atlantis(段树&扫描线&面积和)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- (中等) HDU 1542 Atlantis,扫描线。
Problem Description There are several ancient Greek texts that contain descriptions of the fabled is ...
- HDU 1542 Atlantis(线段树面积并)
描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...
随机推荐
- 终于!Linaro 加盟 Zephyr 项目
导读 为物联网构建实时操作系统的开源协作项目 Zephyr 项目宣布,Linaro 有限责任公司以白金会员的身份加盟该项目.Linaro是一家为 ARM 架构开发开源软件的协作工程组织,也是全球性机构 ...
- java反射之Constructor简单应用
Constructor类是java反射中重要的类,它是对类中构造器的描述的类.类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类). 通过创建Constructor的对象实例 ...
- 交互式报表和工作报表控件Stimulsoft Reports.Fx for Java
Stimulsoft Reports.Fx for Java是一款Java平台下的报表工具控件,可以为您的应用程序添加交互式报表和工作报表.Java技术可以用于不同的平台.不同的操作系统和不同的硬件, ...
- 关于SharePoint REST中的授权的研究
博客地址:http://blog.csdn.net/FoxDave 当我们开发SharePoint APP需要调用REST服务时,可以使用OAuth完成授权,也可以使用跨域库.以下是微软专家的一段注解 ...
- Oracle GoldenGate Veridata 12.1.3已经发布
通过GoldenGate Veridata 12.1.3,现在只需要一键点击即可修复数据复制后不一致的数据. veridata 架构
- 理解NSTypesetter 和 NSATSTypesetter
先说通常意义上的typeset(排字.排版),然后再说NSTypesetter 和 NSATSTypesetter,最后是它们的区别. Typesetting is the composition o ...
- Android布局---相对布局
Android布局分为五大类:相对布局.线性布局.表格布局.帧布局.网格布局 相对布局 语法格式: <RelativeLayout xmlns:android="http://sche ...
- hdu 2078
ps:超水题....(a+b)^2>=a^2+b^2...刚开始还想了好久...真佩服自己.. #include "stdio.h" #define min1(a,b) a& ...
- PHP中目录的操作
文件的操作:创建文件,删除文件,重命名文件rename(),移动/复制文件,读取,大小(PHP都有内置的函数) 目录的操作:创建目录(有),删除目录,复制目录,统计目录大小,遍历(自己定义函数) 一. ...
- PHP中的数组(二)常用数组处理函数
数组的相关处理函数 一.数组键/值操作有关的函数 1.array_values() 无论是关联的还是索引的返回的都是索引数组 <?php $lamp=array(&quo ...