codevs 3044 矩形面积求并 (扫描线)
/*
之前一直偷懒离散化+暴力做着题 今天搞一下扫描线
自己按照线段树的一般写法写的有些问题
因为不用于以前的区间sum
so
题解搬运者23333
Orz~ 去掉了打标记的过程
同时更新区间的时候先判断是不是已经需要赋值
还有一些细节的处理
线段树是离散化之后的x轴建的
每个线段的权值转移到点上
每个点代表他右侧一小段的长度
所以修改[l,r]变为[l,r-1]
另外维护lazy 表示这个区间压了几次
只要lazy[k]>0 s[k]就存着值
碰到顶边就lazy--
每次计算面积用的是s[1] 也就是整个线段的覆盖部分
对于每次的修改时候查询的时候只是上传 最后拿s[1]计算
所以不用下放lazy了就
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1010
#define lc k*2
#define rc k*2+1
#define mid (l+r)/2
using namespace std;
int n,m,lazy[maxn*];
double B[maxn],s[maxn*],ans;
struct node{
double x1,x2,y;
int falg;
}A[maxn];
int cmp(const node &x,const node &y){
return x.y<y.y;
}
void up(int k,int l,int r){
if(lazy[k])s[k]=B[r+]-B[l];
else if(l==r)s[k]=;
else s[k]=s[lc]+s[rc];
}
void Change(int k,int l,int r,int x,int y,int z){
if(x<=l&&y>=r){
lazy[k]+=z;up(k,l,r);return;
}
if(x<=mid)Change(lc,l,mid,x,y,z);
if(y>mid)Change(rc,mid+,r,x,y,z);
up(k,l,r);
}
int main()
{
while(){
scanf("%d",&n);
if(n==)break;m=;
memset(s,,sizeof(s));
memset(lazy,,sizeof(lazy));
double a,b,c,d;
int l,r;ans=;
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
A[++m].x1=a;A[m].x2=c;A[m].y=b;A[m].falg=;B[m]=a;
A[++m].x1=a;A[m].x2=c;A[m].y=d;A[m].falg=-;B[m]=c;
}
sort(B+,B++m);sort(A+,A++m,cmp);
for(int i=;i<=m;i++){
l=lower_bound(B+,B++m,A[i].x1)-B;
r=lower_bound(B+,B++m,A[i].x2)-B-;
if(l<=r)Change(,,m,l,r,A[i].falg);
ans+=(double)(s[]*(A[i+].y-A[i].y));
}
printf("%.2f\n",ans);
}
return ;
}
codevs 3044 矩形面积求并 (扫描线)的更多相关文章
- codevs 3044 矩形面积求并
3044 矩形面积求并 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不 ...
- poj1151==codevs 3044 矩形面积求并
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21511 Accepted: 8110 Descrip ...
- codevs 3044 矩形面积求并 || hdu 1542
这个线段树的作用其实是维护一组(1维 平面(?) 上的)线段覆盖的区域的总长度,支持加入/删除一条线段. 线段树只能维护整数下标,因此要离散化. 也可以理解为将每一条处理的线段分解为一些小线段,要求每 ...
- codves 3044 矩形面积求并
codves 3044 矩形面积求并 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Desc ...
- 【题解】codevs 3044 矩形面积合并
传送门 3044 矩形面积求并 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下 ...
- 3044 矩形面积求并 - Wikioi
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
- [Codevs] 矩形面积求并
http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...
- [codevs3044][POJ1151]矩形面积求并
[codevs3044][POJ1151]矩形面积求并 试题描述 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n ...
- [codevs3044]矩形面积求并
题目描述 Description 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入描述 Input Description 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行 ...
随机推荐
- Welcome to JimmyCheung's blog!
博客开通,写写学习笔记,写写心情,写写生活中的点点滴滴~ 有钱的捧个钱场嘞,没钱的贡献个点击量,新鲜的博客出炉咯,来五毛钱的博文呗~ By Jimmy 2014.09.16
- Optimal Milking
poj2112:http://poj.org/problem?id=2112 题意:K台挤奶机器,C头牛,K不超过30,C不超过200,每台挤奶机器最多可以为M台牛工作,给出这些牛和机器之间,牛和牛之 ...
- 窗体前端显示(ShowWindowAsync有许多优点)
H:=FindWindow('Tfrm_MainForm','aa'); if H>0 then begin ShowWindowAsync(h,SW_MAX); SetFore ...
- c++ RTTI(runtime type info)
RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: ...
- 短信验证码js实现
短信验证码实现 我们在使用移动.电信等运营商网上营业厅的时候,为确保业务的完整和正确性,经常会需要用到短信的验证码.最近因为某省业务需要,也做了个类似的功能. 原理很简单,就是在用户点击"获 ...
- 怎么打开Windows Server 2008 图片预览的功能?
打开一个文件夹,点击菜单中的“工具”->“文件夹选项”,切换到“查看”选项卡,在高级设置中取消如下选项: “始终显示图标,从不显示缩略图” “在缩略图上显示文件图标”
- Web Service和ISAPI的区别与联系 转
Web Service和ISAPI的区别与联系 1.Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service ...
- HDU-2188 悼念512汶川大地震遇难同胞——选拔志愿者
http://acm.hdu.edu.cn/showproblem.php?pid=2188 巴什博奕(Bash Game)的转换:换一种说法而已 悼念512汶川大地震遇难同胞——选拔志愿者 Time ...
- C#中的四舍五入算法
最近在产品开发过程中遇到一个问题,就是在对数值进行截取,例如说保留两位小数时,最终得到的结果跟预期的在某些情况下会产生差异,这个差异的表现就是最后一位与预期的不一致,也就是说在"四舍五入&q ...
- [cocos2dx 3.0 + xcode]疑难点记录
1: 新项目创建 1.下载最新Python,安装 2.解压引擎包 3.运行终端,切换到引擎目录(直接cd拖动文件夹到光标即可得到路径) 4.按照文档例子: $ cd cocos2d-x $ ./set ...