题目:http://poj.org/problem?id=1151

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 10005;
struct node
{
int l,r;
int cov;
double len;
};
struct line
{
double x;
double y1;
double y2;
int f;
bool operator < (const line &a) const
{
return x < a.x;
}
};
class SegTree
{
private:
node tree[N];
double num[N];
int ncount;
public:
SegTree(double a[],int n)
{
for(int i=0;i<n;i++)
num[i] = a[i];
ncount = n;
Build(0,n-1,1);
}
void Build(int l,int r,int rt)
{
tree[rt].l = l;
tree[rt].r = r;
tree[rt].cov = 0;
tree[rt].len = 0;
if(l+1 == r) return;
int mid = (l+r)>>1;
Build(l,mid,2*rt);
Build(mid,r,2*rt+1);
}
void Insert(int l,int r,int p)
{
if(tree[p].l == l && tree[p].r == r)
{
tree[p].cov++;
tree[p].len = num[r] - num[l];
return;
}
int mid = (tree[p].l + tree[p].r)>>1;
if(r <= mid)
Insert(l,r,2*p);
else if(l >= mid)
Insert(l,r,2*p+1);
else
{
Insert(l,mid,2*p);
Insert(mid,r,2*p+1);
}
if(tree[p].cov == 0)
tree[p].len = tree[2*p].len + tree[2*p+1].len;
}
void Delete(int l,int r,int p)
{
if(tree[p].l == l && tree[p].r == r)
{
tree[p].cov--;
if(tree[p].cov <= 0)
{
if(tree[p].l+1 < tree[p].r)
tree[p].len = tree[2*p].len + tree[2*p+1].len;
else
tree[p].len = 0;
}
return;
}
int mid = (tree[p].l + tree[p].r)>>1;
if(r <= mid)
Delete(l,r,2*p);
else if(l >= mid)
Delete(l,r,2*p+1);
else
{
Delete(l,mid,2*p);
Delete(mid,r,2*p+1);
}
if(tree[p].cov == 0)
tree[p].len = tree[2*p].len + tree[2*p+1].len;
}
double getLen()
{
return tree[1].len;
}
};
int main()
{
int test=0,n;
double x1,y1,x2,y2;
double yval[N];
line data[N];
while(~scanf("%d",&n))
{
if(n==0) break;
test++;
int l1 = 0;
int l2 = 0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
yval[l1++] = y1;
yval[l1++] = y2;
data[l2].x = x1;
data[l2].y1 = y1;
data[l2].y2 = y2;
data[l2].f = -1;
l2++;
data[l2].x = x2;
data[l2].y1 = y1;
data[l2].y2 = y2;
data[l2].f = 1;
l2++;
}
sort(yval,yval+l1);
sort(data,data+l2);
l1 = unique(yval,yval+l1) - yval;
double sum = 0;
SegTree stree(yval,l1);
for(int i=0;i<l2-1;i++)
{
int l,r;
l = lower_bound(yval,yval+l1,data[i].y1) - yval;
r = lower_bound(yval,yval+l1,data[i].y2) - yval;
if(data[i].f == -1)
stree.Insert(l,r,1);
else
stree.Delete(l,r,1);
sum += stree.getLen() * (data[i+1].x - data[i].x);
}
printf("Test case #%d\n", test);
printf("Total explored area: ");
printf("%.2lf\n\n", sum);
}
return 0;
}

POJ1151(线段树+扫描线求矩形面积并)相关推荐

  1. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  2. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  3. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  4. Picture 线段树扫描线求轮廓线

    http://acm.hdu.edu.cn/showproblem.php?pid=1828 思路来自http://www.cnblogs.com/ka200812/archive/2011/11/1 ...

  5. POJ1151基本的扫描线求面积

    题意:      给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路:       基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...

  6. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  7. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  8. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  9. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

最新文章

  1. 作业调度算法--高响应比优先 操作系统_处理器管理_编程题
  2. ant design vue input change_Ant-design-vue项目实现动态路由
  3. Loader之一:基本原理
  4. SAP Commerce Accelerator和SAP Spartacus的技术对比
  5. 50多种在Photoshop中删除图像背景的工具和技术,第3页
  6. Mqtt协议IOS端移植3
  7. canvas 绘制直线 并选中_canvas绘制飞线效果
  8. 开通微信服务号需要准备的材料
  9. 计算机视觉相关网站整理
  10. 基于多源大数据的武汉市区域空间格局研究
  11. Druid+Sqlite-JDBC+Kotlin,封装的一个都是毛病的工具类,奆佬们,评论区教一下我怎么封装
  12. 上下文切换频繁,导致load average 过高
  13. 全球及中国现代边桌行业需求预测及发展趋势研究报告2022-2027年
  14. 完美世界GameJam参加报告——《解字》游戏的设计与开发
  15. 【分治思想】12627 Erratic Expansion
  16. 【笔记篇】11仓管系统WCS系统——之《实战供应链》
  17. 机组:真值、原码、反码、补码、移码
  18. pytorch安装教程新手入门
  19. UniApp 本地物资管理出入库系统
  20. android购物车代码简述,Android实现简单购物车功能

热门文章

  1. HandlerExceptionResolvers
  2. 返回后通知(After Return Advice)
  3. 深入理解条件过滤Conditional
  4. EasyExcel实现读操作
  5. 自定义工具类:导入工具类测试
  6. Hive的基本操作-数据库的创建和删除
  7. 定时任务四种实现方式
  8. 数据库-数据库的介绍
  9. adb命令 android 串口_ADB使用linux命令查看Android的使用情况
  10. ElasticSearch(一)基础知识