二维平面n个矩阵形成的面积

给定二维平面n个矩阵,矩阵采用三元组表示(left, right, height)分别表示矩阵的左端点,右端点,以及高。矩阵都以地面作为底边。
矩阵可能相交。求n个矩阵围成的面积。

思想:将矩阵转换成两条直线,从左到右扫描直线,碰到每条直线计算一次面积

解题步骤:

  1. 将矩阵离散化成2n条直线,标记直线是开头还是结尾。
  2. 使用multiset记录出现的直线。
  3. 将直线按照直线的起始位置进行排序,逐条扫描。
  4. 遇到每一条直线,从set中拿出最大值*(上条直线到这条直线的距离),根据直线的类型,更新直线集合
    4.1. 当直线是开头时,插入直线到集合中。
    4.2. 否则,从集合中删除直线时。
    1
    int rectangleArea(vector<rectangle> &recs) {
        int area = 0;
        vector<line> lines;
        for (rectangle rec : recs) {
            lines.push_back(line(rec.height, rec.left, true));
            lines.push_back(line(rec.height, rec.right, false));
        }
        sort(lines.begin(), lines.end(), cmpPos);
        multiset<line> sets;
    
        for (line cur : lines) {
            if (!sets.empty()) {
                area += max(sets.begin()->height, cur.height) * (cur.pos - prevPos);
            }
            if (cur.dir) {
                sets.insert(cur);
            } else {
                sets.erase(sets.find(cur));
            }
            prevPos = cur.pos;
        }
        return area;
    }