//永远只考虑根节点的信息,说明在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. linux系统中的硬链接和软链接

    首先我们需要了解linux下硬链接以及软连接的基本概念.硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用.软链接:也称为符号链接,新建的文件以“路径”的形式来表示另 ...

  2. 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具

    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具 Intro DbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具,原本 ...

  3. Codeforces_729_C

    http://codeforces.com/problemset/problem/729/C 二分找最小容量,然后找符合的最小花费. #include<iostream> #include ...

  4. Python 进行目标检测

    一.前言 从学单片机开始鼓捣C语言,到现在为了学CV鼓捣Python,期间在CSDN.简书.博客园和github这些地方得到了很多帮助,所以也想把自己做的一些小东西分享给大家,希望能帮助到别人.记录人 ...

  5. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  6. 《剑指Offer》第二章(一)题 9 -12

    第二章 面试题9:用两个栈实现队列 题目:如面试题,给你两个栈, 实现队列的先进先出,即在队列头删除一个元素以及在队列的尾部添加一个元素 思路:这个题的分析感觉很巧妙,从一个具体的例子入手,找出其中的 ...

  7. num08---原型模式

    关键点,实现 Cloneable  接口, 重写clone() 方法.克隆出的对象属性保持一致. 案例: 原型模式在spring 源码中的应用: =========================== ...

  8. [redis读书笔记] 第三部分 多机数据库的实现 复制

    另外一篇写的很好很深入的文章:http://www.tuicool.com/articles/fAnYFb : RDB持久化 http://www.tuicool.com/articles/F3Eri ...

  9. ajax 解决中文乱码问题

    最近遇到了ajax 中文乱码的问题.下面总结一下 1. HTTP协议的编码规定 在HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,必须是这些字符进行URL编码后再进行传送.url编码遵循的规则 ...

  10. php面试笔记(2)-php基础知识-常量和数据类型

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...