终于做到了这部分,以前看到这种类型的题只能直接放弃的,现在终于AC了第一个这种题
因为坐标都是浮点数,所以需要对坐标进行离散化(需要插入线段树的坐标进行离散化),为了方便,我直接用了map
将每个矩形的上下两条水平边存到数组中(得记录这条边是下边还是上边,为了计算覆盖次数,下边记为1,上边记为-1),按y的大小排序;从y最小的边开始向上扫描,首先将一条边插入线段树,然后得到当前当前扫描线所在位置的覆盖到的边的总长,
第一次是A1B1边插入到书中,扫描线覆盖到的边的总长就是A1B1,再拿他乘以当前高度和下一条边的高度差,得到底下那个矩形的面积
第二次是第二条黑边插入线段树,这时扫描到的总长度为A2B2,再拿他乘以当前高度和下一条边的高度差,得到中间那个长矩形的面积
第三次是A1B1的对边插入线段树,因为这条边是上边,所以覆盖次数会被-1,挺次,原先线段树中被A1B1覆盖的部分会被-1,所以,此时线段树中能够计算得到扫面线扫到的总长为A3B3的长度,再拿他乘以当前高度和下一条边的高度差,得到最上面那个矩形的面积
三者相加就是总面积了
插入的时候也得注意,不是根据坐标计算出其离散值就当做区间直接插入,而是要将右坐标的离散值减1,这样做的原因是:
这样的两条线段其实没有相互覆盖,但是如果r不减1的话,他们就会变成彼此覆盖的了……在这颗线段树中,一个点其实表示一个区间
这么做了以后,在计算时只要再把r加上1就好了
以下是代码:
#include
#include
#include