//永远只考虑根节点的信息,说明在query时不会调用pushdown
//所有操作均是成对出现,且先加后减
//
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = ;
int n;
//存每一个操作
struct Segment
{
//区间长度
double x;
//纵坐标
double y1, y2;
//权值
int k;
//按横坐标排序
bool operator< (const Segment &t)const
{
return x < t.x;
}
}seg[N * ];
struct Node
{
int l, r;
//被覆盖的次数是多少
int cnt;
//所有权值大于0的长度和是多少
//不考虑祖先节点cnt的前提下(永远只向下看),cnt>0的区间总长
double len;
}tr[N * ];
//离散化,y
vector<double> ys;
//找离散化之后的值
int find(double y)
{
return lower_bound(ys.begin(), ys.end(), y) - ys.begin();
} void pushup(int u)
{
if (tr[u].cnt)
// r+1才是下标 ,减完之后是长度
tr[u].len = ys[tr[u].r + ] - ys[tr[u].l];
//如果不是叶节点,再用两个儿子算
else if (tr[u].l != tr[u].r)
{
tr[u].len = tr[u << ].len + tr[u << | ].len;
}
//如果是叶节点
else tr[u].len = ;
} void build(int u, int l, int r)
{
// cnt是0,len是0
tr[u] = {l, r, , };
if (l != r)
{
int mid = l + r >> ;
build(u << , l, mid), build(u << | , mid + , r);
}
} void modify(int u, int l, int r, int k)
{
//
if (tr[u].l >= l && tr[u].r <= r)
{
tr[u].cnt += k;
pushup(u);
}
else
{
int mid = tr[u].l + tr[u].r >> ;
if (l <= mid) modify(u << , l, r, k);
if (r > mid) modify(u << | , l, r, k);
pushup(u);
}
}
int main()
{
int T = ;
while (scanf("%d", &n), n)
{
ys.clear();
for (int i = , j = ; i < n; i ++ )
{
double x1, y1, x2, y2;
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
//对应的区间加1
seg[j ++ ] = {x1, y1, y2, };
//对应的区间减1
seg[j ++ ] = {x2, y1, y2, -};
ys.push_back(y1), ys.push_back(y2);
}
//对应区间
//离散化
sort(ys.begin(), ys.end());
ys.erase(unique(ys.begin(), ys.end()), ys.end());
//从1号点开始,存的是区间,所以是0到ys.size()-2
build(, , ys.size() - );
//排序
sort(seg, seg + n * );
double res = ;
for (int i = ; i < n * ; i ++ )
{
//第一条线不能加 ,0的时候,还没点加进去
if (i > )
// 为1的长度 区间长度
res += tr[].len * (seg[i].x - seg[i - ].x);
//要把当前的操作 加 到线段树里去
// 左区间 右区间 权值
modify(, find(seg[i].y1), find(seg[i].y2) - , seg[i].k);
}
printf("Test case #%d\n", T ++ );
printf("Total explored area: %.2lf\n\n", res);
}
return ;
}

Atlantis HDU - 1542 线段树+扫描线 求交叉图形面积的更多相关文章

  1. hdu 1542 线段树+扫描线 学习

    学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...

  2. HDU 1542 线段树+扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  7. hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...

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

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

  9. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

随机推荐

  1. supervisor管理tomcat

    操作目的:用supervisor工具管理tomcat服务 配置环境,安装服务,以及多实例 脚本编辑: 前提 机器的opt目录下必须有jdk-8u131-linux-x64_.rpm 以及apache- ...

  2. 最大连续和(dp复习)

    最大连续和:给出一段序列,选出其中连续且非空的一段使得这段和最大. stdin: 7 2 -4 3 -1 2 -4 3 stdout: 4 状态转移方程:dp[i]=max(dp[i-1]+a[i], ...

  3. [PowerShell]Python虚拟环境激活失败

    用Activate.ps1激活还是失效的情况下, 用ISE打开发现路径中的中文乱码了. 所以解决方案有两种, 一是把中文路径改成英文 二是把Activate.ps1脚本用记事本打开另存为ANSI编码即 ...

  4. throw throws区别

    1.throws是在方法上对一个方法进行声明,而不进行处理,向上传,谁调用谁处理: 格式: 权限修饰符 返回值类型 方法名(参数列表) throws Exception1,Exception2...{ ...

  5. golang 自定义结构体(与其他语言对象类似)

    /* 结构体变量: 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存, 因此必须在定义结构体并实例化后才能使用结构体的字段. type 类型名 struct { 字段1 字 ...

  6. Metasploit学习笔记(一) Samba服务 usermap_script安全漏洞相关信息

    一.Samba介绍 Samba是linux和unix系统上实现smb协议的一个免费软件,由客户机和服务器构成.SMB是一种在局域网上实现共享文件和打印机的协议.存在一个服务器,客户机通过该协议可以服务 ...

  7. day13 JS Dom

    js两种存在形式 1:文件 2:块 放到body标签底部 防止加载js超时页面反应慢的问题 声明变量 name = "sb"; //全局变量 var age=18; //局部变量 ...

  8. Android Studio 找不到夜神模拟器的解决办法

    Android Studio 找不到夜神模拟器的解决办法 1.启动夜神模拟器 2.找到你电脑上的夜神安装目录,在bin目录下打开cmd窗口,运行命令 nox_adb.exe connect 127.0 ...

  9. Nginx简介入门

    买了极客时间上陶辉的Nginx核心知识100讲,正在学.链接 Nginx 4个组成部分 二进制可执行文件 nginx.conf 配置文件 access.log error.log nginx 版本 M ...

  10. (数据科学学习手札77)基于geopandas的空间数据分析——文件IO

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的 ...