给定二维平面n个矩阵,矩阵采用三元组表示(left, right, height)分别表示矩阵的左端点,右端点,以及高。矩阵都以地面作为底边。
矩阵可能相交。求n个矩阵围成的面积。
思想:将矩阵转换成两条直线,从左到右扫描直线,碰到每条直线计算一次面积
解题步骤:
- 将矩阵离散化成2n条直线,标记直线是开头还是结尾。
- 使用multiset记录出现的直线。
- 将直线按照直线的起始位置进行排序,逐条扫描。
- 遇到每一条直线,从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; }