//永远只考虑根节点的信息,说明在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. 9. Palindrome Number QuestionEditorial Solution

    Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...

  2. ATL的GUI程序设计(4)

    第四章 对话框和控件 对于Win32 GUI的程序设计来说,其实大部分的情况下我们都不需要自己进行窗口类的设计,而是可以使用Win32中与用户交互的标准方式--对话框(Dialog Box).我们可以 ...

  3. CCF_ 201403-2_窗口

    用deque模拟. #include<iostream> #include<cstdio> #include<deque> using namespace std; ...

  4. windows系统快速安装pytorch的详细教程

    pip和conda的区别 之前一直使用conda和pip ,有时候经常会两者混用.但是今天才发现二者装的东西不是在一个地方的,所以发现有的东西自己装了,但是在运行环境的时候发现包老是识别不了,一直都特 ...

  5. RocketChat:开源聊天软件部署

    1. 简介 RocketChat是一款优秀的开源聊天软件.支持各种平台,IOS.Android.Web.Mac.Windows以及Linux,安装部署简单,功能简单易用,目前部分功能还在完善当中,特别 ...

  6. 对特殊方法的访问 - Special method lookup

    对特殊方法的访问 - Special method lookup 对于用户自定义的 class 来说, 特殊方法只有通过定义对象的类型object’s type (而非通过 instance 的 __ ...

  7. 吴恩达deepLearning.ai循环神经网络RNN学习笔记_看图就懂了!!!(理论篇)

    前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RNN模型怎么解决这个问题 - RNN模型适用的数据特征 - RNN几种类型 RNN模型结构 - RNN block - ...

  8. Kafka中数据的流向

    1: 多个消费者消费同一个Topic数据相同的数据 2: 多个消费者消费同一个Topic数据不同数据 3: 各个消费者按组协调消费 1: 多个消费者消费同一个Topic数据相同的数据 (1)使用一个全 ...

  9. VFP 的 CursorAdapter 相关

    VFP 的 CursorAdapter 是在VFP 8 中增加的最重要的新功能,它提供了一种采用统一接口的方式来访问远程数据源. 现在正值新冠肺炎期间,闲着也是闲着,在整理原理的资料时,发现十多年前的 ...

  10. 基于 H5 Canvas 实现楼宇新风系统

    前言 现如今,新型冠状病毒疫情牵动着每一个人的神经,每天起床后的第一件事就是打开疫情地图,看看最新的疫情数据. (http://www.hightopo.com/demo/coronavirus/) ...