扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫。如果我扫到的是下边,那么久用线段树在这个区间内加上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 (扫描线,线段树)相关推荐

  1. HDU 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

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

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

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

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

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

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

  5. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  6. hdu 4419 Colourful Rectangle (离散化扫描线线段树)

    Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...

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

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

  8. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

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

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

最新文章

  1. 火绒规则 禁止所有软件的安装_软件: Firefox 将禁止扩展静默安装
  2. matlab ia模块,MathWorks发布MATLAB和SimulinkR2020a版本,为工程师和科学家提供更多AI功能...
  3. Mybatis-Plus自动填充的实现示例
  4. wxWidgets:不使用 C++ RTTI 时的注意事项
  5. 多线程相关的一些知识点
  6. debian 下修改boot停留时间
  7. mysql 查出相差年数_MySQL计算两个日期相差的天数、月数、年数
  8. 如何通过图片识别用的什么字体?
  9. pytrhon画图matplolib
  10. android中的Filter接口简介
  11. chrome浏览器下audio自动播放的hack
  12. NASM汇编教程翻译01 第一讲 Hello, World!
  13. 极大似然法python例子
  14. git stage 暂存_Git暂存区之理解Git暂存区(stage)
  15. 对挣钱与財富等三个问题的思考
  16. 回合制游戏指令的执行机制
  17. 单场GMV翻了100倍,冷门品牌崛起背后的“通用法则”是什么?
  18. 卸载腾讯手游模拟器的方法
  19. ubuntu 16.04 安装 openCV 3.2 --对该问题的处理CMake Error at cmake/OpenCVModule.cmake:295 (message)
  20. 基于AM5728 DSP+ARM平台实现无线地磁车辆检测网关

热门文章

  1. 使用EF Core和AngularJS的Master Chef(第3部分)ASP.NET Core MVC
  2. bootsect Linux,linux_bootsect选读.doc
  3. python获取键盘按键键值_python获取键盘输的值
  4. android bugly 符号表,bugly cocos 接入和 符号表使用
  5. mybatis-plus实现自定义字段修改数据 后续更新CRUD
  6. label mpchart 饼图_Android MPChart—饼图-Go语言中文社区
  7. 计算机类系统能力培养试点学校,南昌航空大学获批教育部计算机类专业系统能力培养试点高校...
  8. rootfs 制作ubuntu_制作ubuntu rootfs
  9. 红帽7编译安装mysql_精通RHEL7编译安装mysql-5.5.32
  10. matlab光学谐振腔稳区图,基于图像处理的光学谐振腔自准直研究方法