AcWing 1228. 油漆面积
X星球的一批考古机器人正在一片废墟上考古。
该区域的地面坚硬如石、平整如镜。
管理人员为方便,建立了标准的直角坐标系。
每个机器人都各有特长、身怀绝技。
它们感兴趣的内容也不相同。
经过各种测量,每个机器人都会报告一个或多个矩形区域,作为优先考古的区域。
矩形的表示格式为 (x1,y1,x2,y2),代表矩形的两个对角点坐标。
为了醒目,总部要求对所有机器人选中的矩形区域涂黄色油漆。
小明并不需要当油漆工,只是他需要计算一下,一共要耗费多少油漆。
其实这也不难,只要算出所有矩形覆盖的区域一共有多大面积就可以了。
注意,各个矩形间可能重叠。
输入格式
第一行,一个整数 n,表示有多少个矩形。
接下来的 n 行,每行有 4 个整数 x1,y1,x2,y2,空格分开,表示矩形的两个对角顶点坐标。
输出格式
一行一个整数,表示矩形覆盖的总面积。
数据范围 输入样例1: 输出样例1: 输入样例2: 输出样例2: 这道题是困难难度的题,刚开始看思路还是很难想的,想着用二维树状数组,可是好像看来做不出来,我又想了用区间前缀和,我觉得也应该做不出来的,于是我就看了y总的视频我觉得y总的思路应该是区间覆盖的问题,我们先看一个图 我们对所有的x进行一个排序,每个x放的是y1,y2,以及是否放置一个区间,然后其实线段树是我们的纵坐标,我们求得是所有被覆盖的区间。线段树的操作该怎么写呢? 我们build的操作保存l,r,然后我们pushup操作 代码如下:
1≤n≤10000,
0≤x1,x2,y2,y2≤10000
数据保证 x13
1 5 10 10
3 1 20 20
2 7 15 17
340
3
5 2 10 6
2 7 12 10
8 1 15 15
128
如果要是这个区间完全被覆盖了cnt>0(懒人节点)的情况,就取这个全部区间,要是没有完全被取的话
我们就取两个子树的区间和,我们需要注意一下,l==r的时候是没有子树的,我们需要格外写一个区间防止段错误,pushup的操作就是这样的,
modify的操作是什么:
几乎每个线段树都差不多,我们首先遇到完全被覆盖的区间我们就采取一个cnt>0,然后回溯的一个方式去更新一下节点的len,然后找重复的区间就去递归,不重复的就不递归了。#include