HDU 1542 Atlantis 线段树+离散化+扫描线
题意:给出一些矩形的最上角坐标和右下角坐标,求这些矩形的面积并。
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 线段树+离散化+扫描线相关推荐
- HDU - 1542 Atlantis(线段树+扫描线)
题目链接:点击查看 题目大意:给出n个矩形的左下角坐标和右上角坐标,求出其总面积,注意,矩形会重叠,重叠部分只计算一次 题目分析:如果暴力做需要考虑容斥原理,两两矩形组合判断是否重合,十分麻烦而且时间 ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长
Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...
- hdu 1255(线段树+离散化)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...
- poj--1177(线段树+离散化+扫描线)
题目:http://poj.org/problem?id=1177 A number of rectangular posters, photographs and other pictures of ...
- POJ1177 Picture 线段树+离散化+扫描线
求最终的覆盖图形周长,写这种代码应该短而精确,差的比较远 /* Problem: 1177 User: 96655 Memory: 348K Time: 32MS Language: C++ Resu ...
- HDU 1828 线段树之扫描线之周长并
点击打开链接 题意:给n个矩形,求它们重叠后的周长 思路:用线段树的扫描线从下到上扫一遍,与面积并思想有些相似面积并,下面重边的处理相似,但是周长的并需要求的是竖边的个数然后乘以高度,而面积并求的是底 ...
- hdu 1255(线段树求重叠面积)
扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...
最新文章
- vbs 服务器获取输入信息,取得服务器上用户组列表脚本之VBS版
- RxJava 教程第一部分:为何使用RxJava
- Python3之deepcopy在print调试中的使用技巧
- 【NLP】一行Python代码中自动化文本处理
- busybox 安装mysql_安装busybox
- 李飞飞点赞!,刚刚公布了第一批数据集benchmark入围名单
- 一个很奇怪的css#behavior#saveHistory
- 《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
- 解决uni-app开发中iphoneX下背景不能全屏铺满的问题
- arduino图形编程——ardublock
- 国美易卡线上操作流程,国美易卡利用科技力量
- 论网站CDN的绕过姿势
- 程序员戴耳机是为了撩妹子?感觉好酷的样子~
- CODEVS 2491 玉蟾宫
- 经典查找算法 --- B+树
- 医疗器械软件 软件生存周期过程
- 刀片机服务器虚拟化方案,IBM刀片服务器虚拟化方案
- POI IllegalArgumentException: Sheet index (0) is out of range (no sheets)问题解决
- 分布式限流的解决方案
- 我的世界服务器文件DIM,Minecraft 文件结构介绍
热门文章
- Flutter轮播图
- Mr.J-- jQuery学习笔记(二十四)--剖析jQuery源码--extend
- 开源项目之kisso
- RabbitMQ配置文件
- UIControl UIImage
- RCP:给GEF编辑器添加网格和标尺。
- 数据库设计指南【转】
- Cheatsheet: 2011 09.13 ~ 09.19
- asp.net下的“Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。”错误的一个可能的成因...
- SetInterval(循环计时器)