Atlantis(hdu1542)
题意:求n个矩阵的面积并。
/*
线段树维护扫描线
把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1。
并且如果这条线段添加之前它所在的区间的cover>0,则统计面积。
另外如果求面积的交集,线段所在的区间的cover>1时统计面积。 PS:个人认为某位大神写的博客很好理解(这位大神还搞了一个线段树专辑?%%%):
http://www.cnblogs.com/ka200812/archive/2011/11/13/2247064.html
但是我觉得第一种算法每次都要找到叶子节点,貌似有点浪费时间,然而第二种又不会。。。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 110
using namespace std;
double y[N*];int n,cnt,Cas;
struct node{
double x,y_down,y_up;int flag;
bool operator < (const node &s1)const{
return x<s1.x;
}
};node e[N*];
struct Node{
double x,y_down,y_up;int cover;
int flag;//是否为叶子节点
};Node tree[*N]; void build(int k,int l,int r){
tree[k].cover=;
tree[k].x=-;//代表这个区间最近一次的横坐标
tree[k].y_down=y[l];
tree[k].y_up=y[r];
tree[k].flag=;
if(l+==r){
tree[k].flag=;
return;
}
int mid=l+r>>;
build(k*,l,mid);
build(k*+,mid,r);
} double insert(int k,double x,double l,double r,int flag){
if(r<=tree[k].y_down||l>=tree[k].y_up) return ;
if(tree[k].flag){
if(tree[k].cover>){
double ans=(x-tree[k].x)*(tree[k].y_up-tree[k].y_down);
tree[k].cover+=flag;
tree[k].x=x;
return ans;
}
else {
tree[k].cover+=flag;
tree[k].x=x;
return ;
}
}
double ans=;
ans+=insert(k*,x,l,r,flag);
ans+=insert(k*+,x,l,r,flag);
return ans;
} int main(){
while(scanf("%d",&n)){
if(!n) break;
cnt=;
for(int i=;i<=n;i++){
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
y[++cnt]=y1;
e[cnt].x=x1;
e[cnt].y_down=y1;
e[cnt].y_up=y2;
e[cnt].flag=;
y[++cnt]=y2;
e[cnt].x=x2;
e[cnt].y_down=y1;
e[cnt].y_up=y2;
e[cnt].flag=-;
}
sort(y+,y+cnt+);//写成了sort(y,y+cnt+1),1WA
sort(e+,e+cnt+);
build(,,cnt);
double ans=;
for(int i=;i<=cnt;i++){
ans+=insert(,e[i].x,e[i].y_down,e[i].y_up,e[i].flag);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",++Cas,ans);
}
return ;
}
Atlantis(hdu1542)的更多相关文章
- 扫面线+线段树(hdu1542)
之前写过这个算法,时间长了就忘掉了,,现在不看书自己努力回想起来,对算法的理解,对线段树的理解感觉也更深了一点(可能心理作用,哈哈哈) 思路简单说一下吧 从做到右遍历每一条矩阵的边(左右边),看该边对 ...
- HDU 1542 Atlantis(扫描线算法)
题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...
- POJ 1151 Atlantis(离散化)
点我看题目 题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来. 思路 : 离散化求矩形面积并.离散化具体介绍.将横纵坐标离散开来分别存,然后排序,也可以按照黑书上 ...
- HDU 1542 Atlantis(扫描线)题解
题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...
- 【POJ1151】Atlantis(线段树,扫描线)
[POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
随机推荐
- Xml文档数据提取到Excel表中
近期,财务一位同事,吐槽:<某XX开票软件>导出数据文档只有Xml格式,竟然没有Excel文档,工作起来非常不方便,希望我想想办法.上图: 需求分析:Xml数据----> 提取到Da ...
- 外文翻译 《How we decide》多巴胺的预言 第二节
本节阅读感言:一朝被蛇咬,十年怕井绳.我们的大脑时刻跟新着本体的预测机制. 上一节提到的喇叭,苹果汁实验可以不断的延伸扩展,在播放喇叭前用强光照射...强光照射前放置特定的图片...都可以扩展多巴胺相 ...
- docker最新版本以及docker-compose安装脚本
docker最新版本以及docker-compose编排工具安装脚本 git clone https://github.com/luckman666/shell_scripts.git cd shel ...
- QTP自动FlightReservation小程序,数据库被玩坏了~~~
1.尝试使用CheckPointOnDataBase功能. 2.选中自带的数据库 3.执行Delete * from Orders; 如下图: 4.再次使用FlightReservation的时候,不 ...
- java实现斐波那契的两种方法
package com.ywx.count; /** * 斐波那契数列(地推方式要比递归方式的效率要高) * @author Vashon(yangwenxue) * date:20150320 */ ...
- windows.old文件删除
在安装完新系统后,会发现C盘下有个windows.old文件夹,大约有个10多G,里面都是对之前系统的一些备份,用于对之前系统恢复时使用,一般一个月后会自动清理,若觉得不会再对系统进行老版本恢复时,又 ...
- 消息中间件与RPC的区别
消息中间件和消息通信与RPC各自具有怎样的优势,如何互补消息中间件主要实现的是异步.弹性消息以及队列,弹性消息有时可以借助于外存从而一定程度上可以实现峰值缓存,有效均衡服务器端压力,同时消息可以进行一 ...
- 第十三周翻译:SQL Server安全级别1:SQL Server安全性概述
SQL Server安全级别1:SQL Server安全性概述 源自:Stairway to SQL Server Security Level 1: Overview of SQL Server S ...
- 生成hprof文件,用MAT进行分析
生成hprof文件可以在DDMS选中进程点击窗口左上角的"dump hprof file"按钮来直接生成,也可以通过在程序加代码中来生成 代码2: void generateHpr ...
- jmeter+ant+jenkins
前提:需要先配置下面两个环境,严格按照本人的配置去配,要不然后面你会看不懂 (1)ant+jmeter集成:http://blog.csdn.net/qq_23101033/article/detai ...