//永远只考虑根节点的信息,说明在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. Kafka常用topic操作命令汇总

    offset topic consumer-group consumer producer producer-golang topic 工具 https://cwiki.apache.org/conf ...

  2. zabbix4.0的安装与配置

    #安装zabbix监控首先的先安装LNMP环境,在这里我采用事先准备好的脚本进行安装LNMP环境 脚本内容如下: #!/bin/bash # DATE:Wed Jan # hw226234@126.c ...

  3. Go语言实现:【剑指offer】链表中倒数第k个结点

    该题目来源于牛客网<剑指offer>专题. 输入一个链表,输出该链表中倒数第k个结点. Go语言实现: type ListNode struct { Val int Next *ListN ...

  4. 10-SpringMVC04

    FreeMarker 1.入门案例 1. 导包:freemarker.jar 2. 需要创建模板文件的路径:src/main/resources/template 3. 创建一个模板对象:hello. ...

  5. pytorch之 RNN regression

    关于RNN模型参数的解释,可以参看RNN参数解释 1 import torch from torch import nn import numpy as np import matplotlib.py ...

  6. 安装python 第三方库(whl,py格式)

      注意:在python环境中输入  help('modules')   可以列出所有已经安装的模块     1.windows平台下:            1..1安装whl文件       安装 ...

  7. Tomcat 配置2 tomcat-users.xml

    Tomcat的配置 Tomcat的主要配置文件有3个,分别是:    Tomcat-users.xml.    web.xml    server.xml. 配置Tomcat-users.xml 该文 ...

  8. office2010无法卸载问题

    普通的卸载方式有: 1.从开始进入控制面板卸载程序,找到office2010并卸载. 2.运用软件管家等强力卸载电脑中的软件. 其他的卸载方式: 1).通过安装windows installer cl ...

  9. Day1前端学习之路——概述

    终于下定决心要好好学习前端知识了,以后会把学习过程中的一些随笔记录在这里.HTML.CSS.JavaScript这三大前端语言在大三的时候就有所接触,但是学习的不够深入,这一次希望能够坚持下去. 学习 ...

  10. vue-cli3点滴

    1.如果你不在构造函数中声明private的变量,那么久会提示错误. 2.