题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255

面积交与面积并相似相比回了面积并,面积交一定会有思路,当然就是cover标记大于等于两次时。

但是操作起来发现与面积并有些不同。面积交要从面积并的状态转过来。当cover值为1的时候交

的长度可以为(p为当前节点len1为并的区间长度,len2为交的区间长度)

T[p].len2=T[p<<1].len1+T[(p<<1)|1].len1。这样也能满足cover为2.

当cover为2是那就与并的操作相同。

这题是一道比较简单的面积交模版题,可以拿来练练手。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int M = 2e3 + 10;
double se[M << 1];
struct ss {double l , r , h;int flag;
}s[M << 1];
struct TnT {int l , r , add;double len1 , len2;
}T[M << 2];
bool cmp(ss a , ss b) {return a.h < b.h;
}
void build(int l , int r , int p) {int mid = (l + r) >> 1;T[p].l = l , T[p].r = r , T[p].len1 = T[p].len2 = T[p].add = 0;if(l == r)return ;build(l , mid , p << 1);build(mid + 1 , r , (p << 1) | 1);
}
void pushup(int p) {if(T[p].add >= 2) {T[p].len2 = se[T[p].r + 1] - se[T[p].l];T[p].len1 = T[p].len2;}else if(T[p].add == 1) {T[p].len1 = se[T[p].r + 1] - se[T[p].l];if(T[p].l == T[p].r) {T[p].len2 = 0;}else {T[p].len2 = T[p << 1].len1 + T[(p << 1) | 1].len1;}}else {if(T[p].l == T[p].r) {T[p].len1 = T[p].len2 = 0;}else {T[p].len1 = T[p << 1].len1 + T[(p << 1) | 1].len1;T[p].len2 = T[p << 1].len2 + T[(p << 1) | 1].len2;}}
}
void updata(int l , int r , int p , int ad) {int mid = (T[p].l + T[p].r) >> 1;if(T[p].l == l && T[p].r == r) {T[p].add += ad;pushup(p);return ;}if(mid >= r) {updata(l , r , p << 1 , ad);}else if(mid < l) {updata(l , r , (p << 1) | 1 , ad);}else {updata(l , mid , p << 1 , ad);updata(mid + 1 , r , (p << 1) | 1 , ad);}pushup(p);
}
int main() {int t , n;scanf("%d" , &t);while(t--) {scanf("%d" , &n);int cnt = 0;for(int i = 1 ; i <= n ; i++) {double x1 , x2 , y1 , y2;scanf("%lf%lf%lf%lf" , &x1 , &y1 , &x2 , &y2);s[i].flag = 1;s[i].l = x1;s[i].r = x2;s[i].h = y1;se[++cnt] = x1;se[++cnt] = x2;s[i + n].flag = -1;s[i + n].l = x1;s[i + n].r = x2;s[i + n].h = y2;}sort(se + 1 , se + 1 + cnt);sort(s + 1 , s + 1 + 2 * n , cmp);cnt = unique(se + 1 , se + 1 + cnt) - se - 1;build(1 , cnt , 1);int l , r;l = upper_bound(se + 1 , se + 1 + cnt , s[1].l) - se - 1;r = upper_bound(se + 1 , se + 1 + cnt , s[1].r) - se - 1;r--;double area = 0;updata(l , r , 1 , s[1].flag);for(int i = 2 ; i <= 2 * n ; i++) {area += T[1].len2 * (s[i].h - s[i - 1].h);l = upper_bound(se + 1 , se + 1 + cnt , s[i].l) - se - 1;r = upper_bound(se + 1 , se + 1 + cnt , s[i].r) - se - 1;r--;updata(l , r , 1 , s[i].flag);}printf("%.2lf\n" , area);}return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/6142907.html

hdu1255 覆盖的面积(线段树面积交)相关推荐

  1. HDU1255 覆盖的面积 (线段树 + 扫描线)

    题目链接:覆盖的面积 大致题意 现在有平面直角坐标系xoy, 有n个平行于x轴y轴的矩形, 给出这些矩形的左上角和右下角的坐标, 让你求出这些矩形组成的图形中被至少两个矩形覆盖的部分的总面积. 解题思 ...

  2. 油漆面积 线段树+线扫描 蓝桥杯 java

    X星球的一批考古机器人正在一片废墟上考古. 该区域的地面坚硬如石.平整如镜. 管理人员为方便,建立了标准的直角坐标系. 每个机器人都各有特长.身怀绝技. 它们感兴趣的内容也不相同. 经过各种测量,每个 ...

  3. HDU - 1255 覆盖的面积(线段树+扫描线)

    题目链接:点击查看 题目大意:中文题面,简单明了,不多赘述 题目分析:这个题可以理解为Atlantis的升级版,其实完全可以对Atlantis这道题目的代码稍加修改就可以交上这个题,关键是如何修改?一 ...

  4. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

    我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...

  5. 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)

    传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...

  6. 20.CF817F MEX Queries 线段树(Lazy标记练习)

    20.CF817F MEX Queries 离散化+区间覆盖+区间反转线段树 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 要求维护 ...

  7. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  8. HDU-1255 覆盖的面积 矩形面积交

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 题义为给定N个矩形,求其重叠的图形面积,该题采用线段树离散化y轴坐标,并且采用分割思想,只依据x坐标来进行 ...

  9. POJ 1151 Atlantis 矩形面积求交/线段树扫描线

    Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...

最新文章

  1. 洛谷 P5019 铺设道路(差分)
  2. Cento7 PHP5.6 升级 PHP7.0.0
  3. Oracle database server 安装tips
  4. android让文件按顺序列表,Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先...
  5. 在日志中搜索时间间隔
  6. 百度地图设置显示定位服务器,百度地图后台持续定位
  7. AngularJS 学习笔记值post传值
  8. CAGradientLayer简介 实现颜色渐变
  9. SQL Server T—SQL 基本编程
  10. SpingMVC简易学习笔记二(springMVC的请求和响应)
  11. LM2596电路简析
  12. 设计模式java装饰模式范例_Java设计模式中外观模式和装饰器模式的介绍(代码示例)...
  13. c语言编写一个程序计算某年某月有几天,c语言:输入某一年的第几天,计算并输出它是这一年的第几月第几日,具体怎样编程...
  14. Oracle中如何记录访问数据库的登录信息?
  15. 耐压测试仪结构组成部分
  16. 在Chem 3D软件用什么方法可以改变背景
  17. Bootstrap学习(三)——Bootstrap 插件
  18. Python 中的简单算术计算
  19. linux php 压缩中文乱码,linux下zip文件解压乱码问题的解决办法分享
  20. SDWebImage请求头需要加参数的坑!

热门文章

  1. 计算机专业会比投档线高多少,比投档线高多少安全 投档线和录取线差多少
  2. 19-7-15学习笔记
  3. 网络营销外包——网络营销外包专员如何帮助企业挑选网站建设类型
  4. 浅析网站建设与设计有哪些需要引起重视的行业规范
  5. 三句话不离开用户体验的seo专员到底如何做好用户体验优化?
  6. 两对光纤收发器用网线连接_光纤那么快,路由器和电脑之间为何不用光纤连接,反而用普通网线...
  7. 开发日记-20190328 关键词 利用eolinker一键快速生成API接口文档
  8. CNN中的局部连接(Sparse Connectivity)和权值共享
  9. dnscapy使用——本质上是建立ssh的代理(通过dns tunnel)
  10. DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat