【POJ1151】Atlantis
题目大意:给定 N 个矩形,求这些矩形的面积并。
题解:采用扫描线算法。
首先,按照矩形的横坐标排序,在纵坐标方向上维护一根扫描线被覆盖的长度,在这里采用线段树维护。统计答案时,从左到右扫描 2N 个 X 坐标,两个坐标之间的扫描线被覆盖的长度相等,因此直接长乘宽计入答案即可。
注意事项
- 由于坐标不是整数,因此采用离散化。
- 线段树动态开点即可。
- 跟以往线段树不同的地方在于,这里的线段树的区间修改并没有没有下传标记。原因可以总结为查询时只询问根节点的信息,没有必要下传标记。
代码如下
#include <cstdio>
#include <iostream>
#include <memory>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=210;
int n,kase;
struct re{
double x,y,y1;
int is;
}rec[maxn];
bool cmp(const re &a,const re &b){return a.x<b.x;}
double d[maxn];int cnt;
inline int query(double x){return lower_bound(d+1,d+cnt+1,x)-d;}
struct node{
#define ls(x) t[x].lc
#define rs(x) t[x].rc
int lc,rc,tag;
double len;
}t[maxn<<1];
int tot,root;
inline void maintain(int o,int l,int r){
if(t[o].tag>0)t[o].len=d[r+1]-d[l];
else t[o].len=t[ls(o)].len+t[rs(o)].len;
}
void modify(int &o,int l,int r,int x,int y,int val){
if(!o)o=++tot;
if(l==x&&r==y){t[o].tag+=val;maintain(o,l,r);return;}
int mid=l+r>>1;
if(y<=mid)modify(ls(o),l,mid,x,y,val);
else if(x>mid)modify(rs(o),mid+1,r,x,y,val);
else modify(ls(o),l,mid,x,mid,val),modify(rs(o),mid+1,r,mid+1,y,val);
maintain(o,l,r);
}
void read_and_parse(){
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf%lf",&rec[i].x,&rec[i].y,&rec[i+n].x,&rec[i+n].y);
rec[i].y1=rec[i+n].y,rec[i+n].y1=rec[i].y;
rec[i].is=0,rec[i+n].is=1;
d[i]=rec[i].y,d[i+n]=rec[i+n].y;
}
sort(rec+1,rec+2*n+1,cmp);
sort(d+1,d+2*n+1);
cnt=unique(d+1,d+2*n+1)-d-1;
}
void solve(){
double ans=0;
for(int i=1;i<2*n;i++){
int l=query(rec[i].y),r=query(rec[i].y1);
if(!rec[i].is)modify(root,1,cnt-1,l,r-1,1);
else modify(root,1,cnt-1,r,l-1,-1);
ans+=(rec[i+1].x-rec[i].x)*t[root].len;
}
printf("Test case #%d\n",++kase);
printf("Total explored area: %.2lf\n",ans);
puts("");
}
int main(){
while(scanf("%d",&n)&&n){
memset(t,0,sizeof(t)),memset(rec,0,sizeof(rec));
tot=root=0;
read_and_parse();
solve();
}
return 0;
}
【POJ1151】Atlantis的更多相关文章
- 【POJ1151】Atlantis(线段树,扫描线)
[POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...
- 【POJ1151】【扫描线+线段树】Atlantis
Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...
- 【HDU1542】Atlantis
题意 给出n个矩形的左下角和右上角的坐标,计算总的面积(相交部分只算一次). 分析 线段树扫描线的模板题. 将每个矩形都拆成上下两条线段,然后从下网上扫,当遇到底边时就加上这个区间,遇到顶边时,就减去 ...
- 线段树+扫描线【HDU1542】Atlantis
Description 给定一些二维空间上的矩形,求它们的面积并. 一道线段树+扫描线的板子题 然而即使我会打了,也不能灵活运用这种算法.QAQ 遇到题还是不太会. 但是这种板子题还是随随便便切的. ...
- 【HDU1542】Atlantis (扫描线的经典运用)
点此看题面 大致题意: 给你\(N\)个矩形,请你求出它们覆盖的面积(重叠的面积只算一次). 扫描线 这道题是一道典型的求矩形面积并问题,是扫描线的一个经典运用.这里就不赘述了. 代码 #includ ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- 【42.49%】【hdu 1542】Atlantis(线段树扫描线简析)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- SCI&EI 英文PAPER投稿经验【转】
英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...
随机推荐
- 身在上海的她,该不该继续"坚持"前端开发?
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 对于目前的IT行业,我实在不想她还没在这个行业中站稳脚跟就开始有 ...
- linux-RPM安装
vh可写可不写
- underscore.js常用的API
过滤 var bigClassData = _.filter(data.Results, function (num) { return num.ClassType == 0; }); var fin ...
- 软工个人博客作业Week 1
问题1:在瀑布模型中提到模型,模型(模拟版本)和原型有什么不同,如果与原型有同样的功能,那为什么称之为模型?如果没有同样的功能,又是怎么测试那些程序的? 问题2:怎样才能高效率的广泛而深入地了解用户的 ...
- let命令和块级作用域
学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多. 一.let命令1.概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在 ...
- PAT 甲级 1134 Vertex Cover
https://pintia.cn/problem-sets/994805342720868352/problems/994805346428633088 A vertex cover of a gr ...
- Install Jetty web server on CentOS 7 / RHEL 7
http://www.eclipse.org/jetty/download.html http://www.eclipse.org/jetty/documentation/current/startu ...
- 转帖: Serverless架构模式简介
Serverless架构模式简介 原贴地址:https://blog.csdn.net/chdhust/article/details/71250099?utm_medium=referral&a ...
- 简单对比一下不同Windows操作系统在相同硬件配置的情况下浏览器js引擎的性能
最近部门进行Windows客户端的测试产品单点性能, 感觉不在通的windows版本以及浏览器内核的情况下性能可能有差异, 也一直没有找到一个比较好的对比工具, 今天用chrome的控制台简单测试了下 ...
- 同步工具:CountDownLatch、CyclicBarrier和Semaphore
1. CountDownLatch 1.1 功能及使用场景 一个同步工具,使得一个或多个线程等待一组线程执行完成后再执行. 使用场景:等待一些前置任务执行完成后,再执行特定的功能.比如,系统启动时,各 ...