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组) 每组数据第一行 ...
随机推荐
- Xcode中报错或警告信息整理,持续更新...
整理报错和警告信息,为以后自己查看方便用! [报错1] 信息:Static table views are only valid when embedded in UITableViewContro ...
- java cpu缓存
众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, ...
- asp.net 类库中获取session c#类中获取session
asp.net 类库中获取session c#类中获取session 1. 先引入命名空间 using System.Web; using System.Web.SessionState; 在使用H ...
- Keil 程序调试窗口
上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil提供各种窗口如输出窗口.观察窗口.存储器窗口.反汇编窗口.串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用 ...
- Azure SQL 数据库的灵活缩放预览版简介
Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...
- 博弈论(SG函数):HNOI 2007 分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- Qt 与 JavaScript 通信
使用QWebView加载网页后,解决Qt与JavaScript通信的问题: The QtWebKit Bridge :http://qt-project.org/doc/qt-4.8/qtwebkit ...
- 【leetcode】com/problems/surrounded-regions/
dfs 栈溢出,bfs超时,用dfs非递归就不溢出了,前后写了1一个星期class node { int i; int j; public node(int i1,int j1) { i=i1; j= ...
- Poj 3468-A Simple Problem with Integers 线段树,树状数组
题目:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- 基础排序算法之并归排序(Merge Sort)
并归排序是学习分治法 (Merge Sort) 的好例子.而且它相对于选择,插入,冒泡排序来说,算法性能有一定提升.我首先会描述要解决的问题,并给出一个并归排序的例子.之后是算法的思路以及给出伪代码. ...