报告用的,和之前的内容可能有点重请见谅;)
线段树降维
恍然大悟
给出一些矩形的位置和大小,求总共覆盖面积。
示意图
解法:
一个方向作为扫描线。另一个方向坐标离散化。
扫描线往上划,依次更新区间。
注意:定义好每个变量的含义。
cover是一个区间被完全覆盖时,计数覆盖了几重。子区间不用继承父区间的重数,否则在更新时会出错!(这点坑了一天)
has是一个区间完全没被覆盖置为0,否则只要沾边就置为1.当子区间has为1时,父区间has必定为1.同时该区间cover>0时,has必为1.
void update(int rt, int beg, int end, int l, int r, int flag)
{
if(l > r || end < l || r < beg) return;
if(l <= beg && end <= r)
{
cover[rt] += flag;
if(beg == end)
has[rt] = cover[rt] ? 1 : 0;
else