这个扫描线算法是用线段树完成的,一开始理解有点难度
http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html
算法的思想请看这个blog
然后最近做几个扫描线练习一下(代码还是挺难写的啊,而且变式比较难)
HDU 1542
题意:给你很多矩形,求矩形覆盖的面积
题解:这个就是模板题,理解了思想之后撸一遍模板,cnt是当前区间被覆盖了几次,len是当前区间被覆盖的长度,把x轴的坐标离散化之后,有m个点,所以对应有m-1条边,把这m-1条边对应到线段树里面建树,把m-1条边看成m-1个带权值的点
#include
HDU 1255
题意:给你很多矩形,计算重叠的面积
题解:看着和上面那题差不多,就是记录区间的覆盖次数,如果覆盖了两次以上,就是重叠
但是没有那么好写,要用len记录覆盖一次的长度,inlen记录覆盖两次及以上的长度
cnt是当前区间覆盖的次数,然后pushup的时候当cnt==0的时候当前区间的len和inlen都等于左右儿子的之和
cnt==1的时候当前区间的len等于区间长度,inlen等于左右儿子的len之和(因为左右儿子的len是覆盖过一次,这会大区间又被覆盖一次,所以左右儿子的len变成了大区间的inlen)
cnt>1的时候inlen等于区间长度
然后感觉并不需要pushdown,。不然看着好复杂,因为cnt只记录一层的覆盖情况,不用pushup,pushdown搞来搞去就清楚了很多
#include