[codevs3044]矩形面积求并
|
题目描述 Description
|
|
输入n个矩形,求他们总共占地面积(也就是求一下面积的并)
|
|
输入描述 Input Description
|
|
可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n,表示矩形个数(n<=100) 接下来n行每行4个实数x1,y1,x2,y1(0 <= x1 < x2 <= 100000;0 <= y1 < y2 <= 100000),表示矩形的左下角坐标和右上角坐标 |
|
输出描述 Output Description
|
|
每组数据输出一行表示答案
|
|
样例输入 Sample Input
|
|
2
10 10 20 20 15 15 25 25.5 0 |
|
样例输出 Sample Output
|
|
180.00
|
|
数据范围及提示 Data Size & Hint
|
|
无
|
矩形面积并,扫描线+线段树
本题的线段树比较奇怪
其中的坑点在pushup,线段树维护的区间[l,r]如果l,r相等并不是一段空集,而是线段pos[l]-pos[r+1] 这一线段
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxn=;
int n,add[maxn<<];
double a,b,c,d,pos[maxn],sum[maxn<<],ans;
struct segment
{
double X,x,Y;int tag;
segment(){}
segment(double _1,double _2,double _3,int _4):X(_1),x(_2),Y(_3),tag(_4) {}
bool operator < (const segment &s)const {return Y<s.Y;}
}seg[maxn];
void pushup(int l,int r,int o)
{
if(add[o])sum[o]=pos[r+]-pos[l];
else if(l==r)sum[o]=;
else sum[o]=sum[o<<]+sum[o<<|];
}
void update(int l,int r,int o,int L,int R,int c)
{
if(L==l && r==R)
{
add[o]+=c;
pushup(l,r,o);
return;
}
int mid=(l+r)>>,lo=o<<,ro=lo|;
if(R<=mid)update(l,mid,lo,L,R,c);
else if(L>mid)update(mid+,r,ro,L,R,c);
else update(l,mid,lo,L,mid,c),update(mid+,r,ro,mid+,R,c);
pushup(l,r,o);
}
int main()
{
while(scanf("%d",&n)!=EOF && n)
{
mem(pos,);mem(sum,);mem(add,);ans=;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
seg[i*]=segment(a,c,b,);pos[i*]=a;
seg[i*-]=segment(a,c,d,-);pos[i*-]=c;
}
sort(seg+,seg+n*+);sort(pos+,pos+n*+);
for(int i=;i<=*n;i++)
{
int l=lower_bound(pos+,pos+n*+,seg[i].X)-pos;
int r=lower_bound(pos+,pos+n*+,seg[i].x)-pos-;
update(,*n,,l,r,seg[i].tag);
ans+=sum[]*(seg[i+].Y-seg[i].Y);
}
printf("%.2lf\n",ans);
}
return ;
}
[codevs3044]矩形面积求并的更多相关文章
- [codevs3044][POJ1151]矩形面积求并
[codevs3044][POJ1151]矩形面积求并 试题描述 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n ...
- codves 3044 矩形面积求并
codves 3044 矩形面积求并 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Desc ...
- codevs 3044 矩形面积求并
3044 矩形面积求并 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不 ...
- [Codevs] 矩形面积求并
http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...
- 3044 矩形面积求并 - Wikioi
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- POJ 1151 Atlantis 矩形面积求交/线段树扫描线
Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...
- 矩形面积求并(codevs 3044)
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- poj1151==codevs 3044 矩形面积求并
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21511 Accepted: 8110 Descrip ...
- codevs 3044 矩形面积求并 (扫描线)
/* 之前一直偷懒离散化+暴力做着题 今天搞一下扫描线 自己按照线段树的一般写法写的有些问题 因为不用于以前的区间sum so 题解搬运者23333 Orz~ 去掉了打标记的过程 同时更新区间的时候先 ...
随机推荐
- springcloud(七,多个服务消费者配置,以及zuul网关案例)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
- laravel框架中Job和事件event的解析
本篇文章给大家带来的内容是关于laravel框架中Job和事件event的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做项目的时候,一直对Job和Event有个疑惑.感觉两 ...
- Laravel源码解析之model(代码)
本篇文章给大家带来的内容是关于Laravel源码解析之model(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 提前预祝猿人们国庆快乐,吃好.喝好.玩好,我会在电视上看 ...
- PHP中直接使用sql语句
SELECT * FROM `tf_user` WHERE (`company_id` = '117' OR `other_company_ids` LIKE '%117,%' OR `other_c ...
- history路由模式下的nginx配置
路由模式 众所周知,浏览器下的单页面应用的路由模式有下面两种: hash 模式和 history 模式.hash 模式通用性好,而且不依赖服务器的配置,省心省力,但是缺点是不够优雅.相比于 hash ...
- 正在开发的JavaScript引擎有哪些?
正在开发的JavaScript引擎有哪些? V8,用C++编写,开放源代码,由Google丹麦开发,是Google Chrome的一部分,也用于Node.js. JavaScriptCore,开放源代 ...
- WPF ObservableCollection,INotifyPropertyChanged
xaml: <DockPanel Margin="10"> <StackPanel DockPanel.Dock="Rig ...
- IdentityService4学习笔记之Client Credentials
IdentityService4简介 一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制. 前文 今天介绍ClientCredentials认证类型,适用 ...
- 【VS2019】Web项目发布时提示无法连接FTP服务器
使用 Visual Studio 2019 时出现的问题 环境:win10 ltsc 场景 发布Web项目到FTP时 失败,并提示 _无法打开网站"ftp://...".未安装与 ...
- oracle高级部分
回顾 多表关联查询的方式 内连接 根据AB表关联的条件进行过滤查询,只保留满足条件数据 Select * from a,b where a.xxx=b.xxx; Select * from a inn ...