Atlantis HDU - 1542 (扫描线,线段树)
扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫。如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把之前的消掉,然后线段树维护区间内的长度,这里不是直接用下标维护,而是需要另一个数组来维护,每次记录我当前的下标在原本的图中的长度。
在update部分用一个点表示我这个点以后的一个长度为1的区间,然后这样算出来的sum[1]就是我现在线段树里包括的区间大小,然后用现在的区间大小去乘上这一部分的高度,然后每次相加,就可以了
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define lowbit(x) (x & (-x))typedef unsigned long long int ull; typedef long long int ll; const double pi = 4.0*atan(1.0); const int inf = 0x3f3f3f3f; const int maxn = 305; const int maxm = 305; using namespace std;int n, m, tol, T; struct Node {double l, r, h;int f;bool operator <(Node a) const {return h < a.h;} }; Node node[maxn]; double a[maxn]; double sum[maxn << 2]; int cnt[maxn << 2];void init() {memset(sum, 0, sizeof sum);memset(cnt, 0, sizeof cnt); }void pushup(int left, int right, int root) {if(cnt[root] != 0) sum[root] = a[right + 1] - a[left];else if(left == right) sum[root] = 0;else sum[root] = sum[root << 1] + sum[root << 1 | 1]; }void update(int left, int right, int prel, int prer, int val, int root) {if(prel <= left && right <= prer) {cnt[root] += val;pushup(left, right, root);return ;}int mid = (left + right) >> 1;if(prel <= mid) update(left, mid, prel, prer, val, root << 1);if(prer > mid) update(mid+1, right, prel, prer, val, root << 1 | 1);pushup(left, right, root); }int main() {int cas = 1;while(scanf("%d", &n)== 1 && n) {init();double x1, y1, x2, y2;for(int i=1; i<=n; i++) {scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);node[2*i-1].l = x1;node[2*i].l = x1;node[2*i-1].r = x2;node[2*i].r = x2;node[2*i-1].h = y1;node[2*i].h = y2;node[2*i-1].f = 1;node[2*i].f = -1;a[2*i-1] = x1;a[2*i] = x2;}n = 2*n;sort(node+1, node+1+n);sort(a+1, a+1+n);int nn = unique(a+1, a+1+n) - (a+1);double ans = 0;for(int i=1; i<n; i++) {int l = lower_bound(a+1, a+1+nn, node[i].l) - a;int r = lower_bound(a+1, a+1+nn, node[i].r) - a;update(1, nn, l, r-1, node[i].f, 1);ans += (node[i+1].h - node[i].h) * sum[1];}printf("Test case #%d\n", cas++);printf("Total explored area: %0.2f\n", ans);printf("\n");}return 0; }
View Code
转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9356322.html
Atlantis HDU - 1542 (扫描线,线段树)相关推荐
- HDU 2795 Billboard (线段树+贪心)
HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...
- 【HDU5091】Beam Cannon,扫描线+线段树
传送门 思路: 扫描线的经典问题 然而并不是很会做-- 对x坐标差分一下(例如(x,y)类型为1,(x+w,y)的类型就是-1,以便于之后扫描可以去除该点),然后对y坐标转化为正数(便于操作为线段树上 ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- 扫描线+线段树简介 AcWing 248窗内的星星题解
----出自南昌理工学院ACM集训队 这周学习了线段树和扫描线的解题方法,下面由小菜鸡简介一下: 一般扫描线的题目最简单的便是扫描线裸模板(一般来说的话:数据范围小),其次的话便是进行拓展成线段树+扫 ...
- HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***
题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...
- hdu 4419 Colourful Rectangle (离散化扫描线线段树)
Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...
- POJ 1177 Picture [离散化+扫描线+线段树]
http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...
- HDU 5861 Road 线段树区间更新单点查询
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...
- hdu 1255(线段树求重叠面积)
扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...
最新文章
- 火绒规则 禁止所有软件的安装_软件: Firefox 将禁止扩展静默安装
- matlab ia模块,MathWorks发布MATLAB和SimulinkR2020a版本,为工程师和科学家提供更多AI功能...
- Mybatis-Plus自动填充的实现示例
- wxWidgets:不使用 C++ RTTI 时的注意事项
- 多线程相关的一些知识点
- debian 下修改boot停留时间
- mysql 查出相差年数_MySQL计算两个日期相差的天数、月数、年数
- 如何通过图片识别用的什么字体?
- pytrhon画图matplolib
- android中的Filter接口简介
- chrome浏览器下audio自动播放的hack
- NASM汇编教程翻译01 第一讲 Hello, World!
- 极大似然法python例子
- git stage 暂存_Git暂存区之理解Git暂存区(stage)
- 对挣钱与財富等三个问题的思考
- 回合制游戏指令的执行机制
- 单场GMV翻了100倍,冷门品牌崛起背后的“通用法则”是什么?
- 卸载腾讯手游模拟器的方法
- ubuntu 16.04 安装 openCV 3.2 --对该问题的处理CMake Error at cmake/OpenCVModule.cmake:295 (message)
- 基于AM5728 DSP+ARM平台实现无线地磁车辆检测网关
热门文章
- 使用EF Core和AngularJS的Master Chef(第3部分)ASP.NET Core MVC
- bootsect Linux,linux_bootsect选读.doc
- python获取键盘按键键值_python获取键盘输的值
- android bugly 符号表,bugly cocos 接入和 符号表使用
- mybatis-plus实现自定义字段修改数据 后续更新CRUD
- label mpchart 饼图_Android MPChart—饼图-Go语言中文社区
- 计算机类系统能力培养试点学校,南昌航空大学获批教育部计算机类专业系统能力培养试点高校...
- rootfs 制作ubuntu_制作ubuntu rootfs
- 红帽7编译安装mysql_精通RHEL7编译安装mysql-5.5.32
- matlab光学谐振腔稳区图,基于图像处理的光学谐振腔自准直研究方法