题意:给出一些矩形的最上角坐标和右下角坐标,求这些矩形的面积并。

NotOnlySuccess 线段树专辑中扫描线模板题,弱智的我对着大大的代码看了一下午才搞懂。 具体见思路见注释=。=

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>#define lson rt<<1,l,mid
#define rson rt<<1|1,mid + 1,r
using namespace std;
const int maxn = 4004;struct Seg {double l, r, x;int cover;Seg(double l, double r, double x, int cover) :l(l), r(r), x(x), cover(cover) {}//排序大小按照x轴的坐标大小bool operator < (const Seg &tmp) const {return x < tmp.x;}
};int n, cnt[maxn << 2];
double len[maxn << 2];
vector<double> dy;
vector<Seg> seg;int GetID(double Val) {//二分查找点的坐标,离散化return lower_bound(dy.begin(), dy.end(), Val) - dy.begin();
}void pushup(int rt, int l, int r) {int lc = rt << 1, rc = rt << 1 | 1;//如果当前线段存在,更新坐标//这里r+1是因为长度为x的线段有x+1个点,所以最后一个点是r+1if (cnt[rt]) len[rt] = dy[r + 1] - dy[l];else if (r == l) len[rt] = 0; else len[rt] = len[lc] + len[rc];
}void update(int rt, int l, int r, int ql, int qr, int Val) {int lc = rt << 1, rc = rt << 1 | 1, mid = (l + r) >> 1;if (ql <= l && qr >= r) {//累加当前线段的值cnt[rt] += Val;pushup(rt, l, r);}else {//标记不需要下放,因为当前线段的增减和子线段没有关系//而且每条线段必定增加一次,减少一次if (ql <= mid) update(lson, ql, qr, Val);if (qr > mid) update(rson, ql, qr, Val);pushup(rt, l, r);}
}int main() {int kase = 1;while (scanf("%d", &n),n != 0) {//初始化线段树dy.clear(); seg.clear();memset(cnt, 0, sizeof(cnt));memset(len, 0, sizeof(len));//读入数据for (int i = 1; i <= n; i++) {double x1, x2, y1, y2; scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);//将每个矩形抽象成两条线段seg.push_back(Seg(y1, y2, x1, 1));seg.push_back(Seg(y1, y2, x2, -1));//存储每个坐标的值dy.push_back(y1); dy.push_back(y2);}//将浮点坐标离散化sort(dy.begin(), dy.end());dy.erase(unique(dy.begin(), dy.end()), dy.end());//将线段排序sort(seg.begin(), seg.end());int msize = seg.size(), k = dy.size();double ret = 0;for (int i = 0; i < msize - 1; i++) {//这里的qr为什么要减一? 是因为我线段树每个节点存的是l,r之间的线段,而不是点集,把每个线段当成点来看的话,//每个[l,r]的点构成的线段编号应该是[l,r-1]int ql = GetID(seg[i].l), qr = GetID(seg[i].r) - 1;//更新值update(1, 0, k - 1, ql, qr, seg[i].cover);//累加当前扫描线扫过的面积ret += len[1] * (seg[i + 1].x - seg[i].x);}printf("Test case #%d\nTotal explored area: %.2lf\n\n", kase++, ret);}return 0;
}

  

转载于:https://www.cnblogs.com/rolight/p/3916832.html

HDU 1542 Atlantis 线段树+离散化+扫描线相关推荐

  1. HDU - 1542 Atlantis(线段树+扫描线)

    题目链接:点击查看 题目大意:给出n个矩形的左下角坐标和右上角坐标,求出其总面积,注意,矩形会重叠,重叠部分只计算一次 题目分析:如果暴力做需要考虑容斥原理,两两矩形组合判断是否重合,十分麻烦而且时间 ...

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

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

  3. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长

    Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...

  5. hdu 1255(线段树+离散化)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  6. poj--1177(线段树+离散化+扫描线)

    题目:http://poj.org/problem?id=1177 A number of rectangular posters, photographs and other pictures of ...

  7. POJ1177 Picture 线段树+离散化+扫描线

    求最终的覆盖图形周长,写这种代码应该短而精确,差的比较远 /* Problem: 1177 User: 96655 Memory: 348K Time: 32MS Language: C++ Resu ...

  8. HDU 1828 线段树之扫描线之周长并

    点击打开链接 题意:给n个矩形,求它们重叠后的周长 思路:用线段树的扫描线从下到上扫一遍,与面积并思想有些相似面积并,下面重边的处理相似,但是周长的并需要求的是竖边的个数然后乘以高度,而面积并求的是底 ...

  9. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

最新文章

  1. vbs 服务器获取输入信息,取得服务器上用户组列表脚本之VBS版
  2. RxJava 教程第一部分:为何使用RxJava
  3. Python3之deepcopy在print调试中的使用技巧
  4. 【NLP】一行Python代码中自动化文本处理
  5. busybox 安装mysql_安装busybox
  6. 李飞飞点赞!,刚刚公布了第一批数据集benchmark入围名单
  7. 一个很奇怪的css#behavior#saveHistory
  8. 《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
  9. 解决uni-app开发中iphoneX下背景不能全屏铺满的问题
  10. arduino图形编程——ardublock
  11. 国美易卡线上操作流程,国美易卡利用科技力量
  12. 论网站CDN的绕过姿势
  13. 程序员戴耳机是为了撩妹子?感觉好酷的样子~
  14. CODEVS 2491 玉蟾宫
  15. 经典查找算法 --- B+树
  16. 医疗器械软件 软件生存周期过程
  17. 刀片机服务器虚拟化方案,IBM刀片服务器虚拟化方案
  18. POI IllegalArgumentException: Sheet index (0) is out of range (no sheets)问题解决
  19. 分布式限流的解决方案
  20. 我的世界服务器文件DIM,Minecraft 文件结构介绍

热门文章

  1. Flutter轮播图
  2. Mr.J-- jQuery学习笔记(二十四)--剖析jQuery源码--extend
  3. 开源项目之kisso
  4. RabbitMQ配置文件
  5. UIControl UIImage
  6. RCP:给GEF编辑器添加网格和标尺。
  7. 数据库设计指南【转】
  8. Cheatsheet: 2011 09.13 ~ 09.19
  9. asp.net下的“Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。”错误的一个可能的成因...
  10. SetInterval(循环计时器)