没有传送门。
不清楚离散化的可以先看看这篇博文:离散化介绍


题意

在2051年,若干火星探险队探索了这颗红色行星的不同区域并且制作了这些区域的地图。现在,Baltic空间机构有一个雄心勃勃的计划,他们想制作一张整个行星的地图。为了考虑必要的工作,他们需要知道地图上已经存在的全部区域的大小。你的任务是写一个计算这个区域大小的程序。
具体任务要求为:
(1)从输入中读取地图形状的描述;
(2)计算地图覆盖的全部的区域;
(3)输出探索区域的总面积(即所有矩形的公共面积)。


输入

输入的第一行包含一个整数n(1≤n≤10000),表示可得到的地图数目。

以下n行,每行描述一张地图。每行包含4个整数x1,y1,x2和y2(0≤x1<x2≤30000,0≤y1<y2≤30000)。数值(x1,y1)和(x2,y2)是坐标,分别表示绘制区域的左下角和右上角坐标。每张地图是矩形的,并且它的边是平行于x坐标轴或y坐标轴的。


输出

输出文件包含一个整数,表示探索区域的总面积(即所有矩形的公共面积)。


题解

扫描线裸题,线段树实现。
    面积是二维的,我们选择一维构造线段树,另一维按顺序不断扫描即可。


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll ;
const int N=8e4+10;//空间要开够 不然很容易re和wa
int n,ty[N],t[N],tag[N];
ll area=0;struct L{int xa,xb,y;bool up;
}l[N];bool cmp(L A,L B){return A.y<B.y;
}
struct Node{int l,r;int c,width;
}e[N];inline int read()
{char c=getchar();int x=0;while(c<'0' || c>'9') c=getchar();while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x;
}inline void build(int k,int L,int R)
{e[k].l=L;e[k].r=R;e[k].c=0;e[k].width=0;if(L+1==R) return;int mid=(L+R)>>1;build(k<<1,L,mid);build(k<<1|1,mid,R);//not-mid+1->false
}inline void update(int k)
{if(e[k].c>0) {e[k].width=t[e[k].r]-t[e[k].l];}else if(e[k].l+1==e[k].r){e[k].width=0;}else{e[k].width=e[k<<1].width+e[k<<1|1].width;}
}
inline void add(int k,int L,int R)
{if(e[k].l>=L && e[k].r<=R){e[k].c++;update(k);return;}int mid=(e[k].l+e[k].r)>>1;if(L<mid) add(k<<1,L,R);if(R>mid) add(k<<1|1,L,R);update(k);
}inline void del(int k,int L,int R)
{if(e[k].l>=L && e[k].r<=R){e[k].c--;update(k);return;}int mid=(e[k].l+e[k].r)>>1;if(L<mid) del(k<<1,L,R);if(R>mid) del(k<<1|1,L,R);update(k);
}int main(){scanf("%d",&n);for(int i=0;i<n;i++){int a=read(),b=read(),c=read(),d=read();l[i<<1].xa=a;l[i<<1].xb=c;l[i<<1].y=b;l[i<<1].up=true;l[i<<1|1].xa=a;l[i<<1|1].xb=c;l[i<<1|1].y=d;l[i<<1|1].up=false;ty[i<<1]=a;ty[i<<1|1]=c;}n<<=1;sort(l,l+n,cmp);sort(ty,ty+n);int num=0;t[0]=ty[0];for(int i=1;i<n;i++){if(ty[i]!=ty[i-1]){t[++num]=ty[i];}}//离散化 for(int i=0;i<=num;i++) tag[t[i]]=i;build(1,0,num);for(int i=0;i<n-1;i++){//i<n-1 calculate the above partint la=tag[l[i].xa],ra=tag[l[i].xb];if(l[i].up) add(1,la,ra);else del(1,la,ra);area+=e[1].width*(ll)(l[i+1].y-l[i].y);}printf("%lld\n",area);return 0;
}

【扫描线】火星探险-线段树相关推荐

  1. JZOJ 6276.树【扫描线】【线段树】

    233 题目: 题意: 分析: 代码: 题目: 传送门 题意: 有一棵无根树,现在有mmm个点对x,yx,yx,y,要求在任意u,vu,vu,v的简单路径上不能既经过xxx又经过yyy 问一共有多少路 ...

  2. SSLOJ 1459.空间简单度【扫描线】【线段树】

    ... 题意: 分析: 代码: 题意: 给出一棵树以及若干条边 给出一个定值kkk,求有多少条路径的空间简单度>k>k>k 而空间简单度的定义如下: 分析: 这道题和JZOJ(GMO ...

  3. 【YBT2023寒假Day13 C】百里守约(Boruvka算法)(扫描线)(线段树)

    百里守约 题目链接:YBT2023寒假Day13 C 题目大意 有一个 n*n 的矩阵,一开始里面都是 0,多次操作,每次把一个子矩阵里面的值都增加每次给出的 w. 然后全部操作完之后构造一个 n 个 ...

  4. 【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)

    文章目录 Gorgeous Sequence Tyvj 1518 CPU监控 [清华集训2015]V Naive Operations Picture Walking Race Gorgeous Se ...

  5. 线段树 by yyb

    线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...

  6. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  7. 线段树 --算法竞赛专题解析(24)

    本系列文章将于2021年整理出版.前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当   作者签名书:点我 有建议请加QQ 群:567554289 文章目录 1. 线段树概 ...

  8. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  9. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  10. 线段树区间扫描线超详解,一篇文章搞懂扫描线

    怨念 这个专题其实不难,但是翻了一圈网上的博客,写得是云里雾里,我打算用一篇博客把它讲明白 前序知识 能看懂这篇文章需要: 线段树基础知识. 线段树染色问题基本概念. 离散化操作 目标 首先这个扫描线 ...

最新文章

  1. 链路聚合_rhel7下的链路聚合配置
  2. MySQL查询获取行号rownum
  3. python中值滤波去除椒盐噪声_python 中值滤波,椒盐去噪,图片增强实例
  4. java web 页面提速
  5. oracle 分析函数、GROUPING函数
  6. myisam和innodb
  7. 01python初识—编辑器版本变量知识
  8. cocos2d-lua 搓牌效果_夏天这样洗澡才叫爽,用它搓一搓,脏东西都出来了
  9. 不会真有人觉得聊天机器人难吧——开篇
  10. Android中resource参数变量使用
  11. PHP许愿墙的经济可行性,深入PHP许愿墙模块功能分析
  12. Windows 域的简单说明
  13. 单层for循环最详解
  14. “我爱淘”冲刺阶段Scrum站立会议8
  15. Prince和学生们侃侃而谈系列05
  16. Python学习Day01
  17. DL3 - optimization algorithms
  18. Xiuno 简约白色主题
  19. 分享多张图片到微信朋友圈
  20. 八月冲刺月紧张记录(目标400+

热门文章

  1. 十二星座谁最不会顾及别人感受?
  2. EDI 公开课:X12 850采购订单转换至可视化Excel
  3. 微信问卷调查html,最详细测评!在微信里做问卷调查,这 4 款小程序你一定会用到...
  4. lighttpd 记录
  5. python中pip安装报错的一些总结
  6. 系统与软件过程改进09年年会,CMMI vs 敏捷PK赛参赛感言
  7. Unable to obtain current patch information due to error: 20001, ORA-20001: Latest xml inventory is n
  8. rxj热血江hsf湖私服_如何使用RxJ进行React性思考和动画化移动对象
  9. 计算机考研909考试大纲,山东大学2019年909数据结构考研大纲
  10. 随笔:《像火箭科学家一样思考:将不可能变成可能》观书有感