题意:给定平面直角坐标系中的N个矩形,求它们的面积并。

题解:建立一个四元组(x,y1,y2,k).(假设y1<y2)用来储存每一条线,将每一条线按x坐标排序。记录所有的y坐标以后排序离散化。离散化之后线段树的第i个叶子节点储存的是y[i+1]-y[i].

这里的线段树用的是一个不用下传延迟标记的做法(仅限这一类题)。线段树的每一个节点维护length(这个节点的子节点覆盖的长度)和cnt(这个节点代表的线段[l,r]所覆盖的次数)。

任意一个区间都可以被线段树划分成O(logn)个子区间,我们把这些节点的cnt值加上1或减去1。

在修改任意一个节点的cnt时或者向上维护信息的时候,如果这个节点的cnt>0,则这个节点所代表的区间覆盖的长度是y[r+1]-y[l],否则是子节点的长度和。

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
map<double,int> mp;
const int maxn=200010;
struct ST{int l,r,cnt;double length;
}t[4*maxn];
struct node{double x,y1,y2;int k;bool operator <(const node& rhs)const{return x<rhs.x;}
}a[maxn];
double b[maxn];
void build(int p,int l,int r){t[p].l=l,t[p].r=r;t[p].cnt=0;t[p].length=0;if(l==r){return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);
}
void maintain(int p){if(t[p].l==t[p].r)t[p].length=0;else t[p].length=t[p*2].length+t[p*2+1].length;
}
void change(int p,int l,int r,int k){if(l<=t[p].l&&r>=t[p].r){t[p].cnt+=k;if(t[p].cnt>0){t[p].length=b[t[p].r+1]-b[t[p].l];}elsemaintain(p);return;}int mid=(t[p].l+t[p].r)/2;if(mid>=l)change(p*2,l,r,k);if(mid<r)change(p*2+1,l,r,k);if(t[p].cnt>0)t[p].length=b[t[p].r+1]-b[t[p].l];else maintain(p);
}
int main(){int n,kase=0;double x1,x2,y1,y2;double ans=0;while(~scanf("%d",&n)&&n){ans=0;mp.clear();for(int i=1;i<=n;i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);a[i]=(node){x1,y1,y2,1};a[i+n]=(node){x2,y1,y2,-1};b[i]=y1,b[i+n]=y2;}sort(a+1,a+1+2*n);sort(b+1,b+1+2*n);int m=unique(b+1,b+1+2*n)-(b+1);for(int i=1;i<=m;i++)mp[b[i]]=i;build(1,1,m-1);for(int i=1;i<2*n;i++){int l=mp[a[i].y1],r=mp[a[i].y2]-1;change(1,l,r,a[i].k);ans+=(a[i+1].x-a[i].x)*(t[1].length);}printf("Test case #%d\nTotal explored area: %.2f\n\n",++kase,ans);}return 0;
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/9688471.html

POJ 1151 扫描线 线段树相关推荐

  1. POJ 1151 Atlantis 线段树+扫描线

    解题思路: 先将y轴进行离散化.n个矩形的2n个横边纵坐标共构成最多2n-1个区间的边界,对这些区间编号,建立起线段树. x轴记录左边和右边,左边时是矩形面积增加,覆盖层数增加边,右边是形面积减少,覆 ...

  2. poj 1151(线段树求面积并)

    解题思路:线段树求面积并,水题 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  3. POJ 2352 Stars (线段树)

    POJ 2352 Stars (线段树) 手动博客搬家:本文发表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/detai ...

  4. 【HDU5091】Beam Cannon,扫描线+线段树

    传送门 思路: 扫描线的经典问题 然而并不是很会做-- 对x坐标差分一下(例如(x,y)类型为1,(x+w,y)的类型就是-1,以便于之后扫描可以去除该点),然后对y坐标转化为正数(便于操作为线段树上 ...

  5. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  6. 扫描线+线段树简介 AcWing 248窗内的星星题解

    ----出自南昌理工学院ACM集训队 这周学习了线段树和扫描线的解题方法,下面由小菜鸡简介一下: 一般扫描线的题目最简单的便是扫描线裸模板(一般来说的话:数据范围小),其次的话便是进行拓展成线段树+扫 ...

  7. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  8. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  9. poj 2352 Stars(线段树)

    题目:http://poj.org/problem?id=2352 大意:一些星星有自己的优先级,优先级是x坐标和y坐标小于等于该星星坐标的星星个数 思路:由于这个题的y值是从小到大排列,所以对x建立 ...

最新文章

  1. Beautiful Subarrays (01字典树 瞎搞)
  2. android studio device功能,Android Studio 3.0找不到Android Device Monitor
  3. git clone报错:fatal: could not create work tree dir ‘code_update‘
  4. 从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线
  5. *【POJ - 2796】 Feel Good (前缀和优化+单调栈维护)
  6. 南信大c语言实验8报告,北科大C语言程序设计实验报告8论文报告.doc
  7. realme x2 深度测试打不开_realme 的产品到底是不是贴牌的?
  8. 自定义数据格式的矢量地图实现
  9. php十六进制字符串转成字节数组_PHP中的数据类型及实例演示
  10. safari里的touch事件解析
  11. 对第三组博客的检查情况
  12. 拓端tecdat|R语言Gibbs抽样的贝叶斯简单线性回归仿真分析
  13. Android手机端脚本录制
  14. 1222-周一开盘红红火火大涨的一天。EG,PVC,沪铜,国际铜,纯碱涨停
  15. Qt 5.15版本安装教程
  16. matlab 绘制对数曲线图,大神经验!教你用matlab画对数坐标!
  17. 详解木头自动填表浏览器使用方法
  18. python爬取头条付费专栏视频_用Python编写爬取头条视频的代码
  19. 字母顺序排序(C语言)
  20. 【2022省选模拟】叮叮车——卡特兰数、数位DP

热门文章

  1. Python3 日期与时间戳相互转换
  2. Halcon 和 C# 联合编程 - 如何使用开源项目 ViewROI
  3. 一些关于Spring的随笔
  4. 自己写一个java.lang.reflect.Proxy代理的实现
  5. 一个轻量级javascript框架的设计模式
  6. 哪本书是对程序员最有影响(stackoverflow)
  7. extjs给panel添加滚动条_extjs.treePanel在ie9下滚动条的显示问题-阿里云开发者社区...
  8. ppt手动放映怎么设置_一键解决PPT的动画播放和动画排序问题!
  9. 云服务器磁盘挂载_实战记录阿里云服务器不关机扩展系统盘容量/磁盘扩容
  10. 基于FPGA实现UART接口设计(异步串行通信)