[CODEVS 3044] 矩形面积求并
2015-02-18 22:07
381 查看
分析
先贴个Matrix67的讲离散化的博客地址: http://www.matrix67.com/blog/archives/108
其实上面的博客讲的讲的就很清楚了.
就相当于把矩形用许多小矩形来代替. 这些小矩形都是有一边或几条边延长后过其他矩形的顶点. 这么一说好像更复杂了. 换个说法, 就是把所有矩形的边都作为可无限延长的分割线, 将所有矩形分割成小矩形. 每个小矩形作为一个新的点, 然后在bool数组里记录哪个点被覆盖, 可以通过预处理或者临时计算出小矩形的面积. 最后扫一遍统计结果.
代码
49ms 256kB
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100 + 10; struct Matrix { double x1, y1, x2, y2; } matrixs[maxn]; double x[maxn<<1], y[maxn<<1]; bool covered[maxn<<1][maxn<<1]; int main() { int n; while(scanf("%d", &n) == 1) { if(n == 0) break; for(int i = 0; i < n; i++) { double x1, y1, x2, y2; scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2); matrixs[i] = (Matrix) {x1, y1, x2, y2}; x[i<<1] = x1; y[i<<1] = y1; x[(i<<1) ^ 1] = x2; y[(i<<1) ^ 1] = y2; } sort(x, x + 2*n); sort(y, y + 2*n); // 以左下点的坐标作为格子的编号. memset(covered, 0, sizeof(covered)); for(int cur = 0; cur < n; cur++) { int s_x, s_y, t_x, t_y; Matrix& M = matrixs[cur]; for(s_x = 0; x[s_x] < M.x1; s_x++); for(s_y = 0; y[s_y] < M.y1; s_y++); for(t_x = s_x; x[t_x] < M.x2; t_x++); for(t_y = s_y; y[t_y] < M.y2; t_y++); // cover for(int i = s_x; i < t_x; i++) for(int j = s_y; j < t_y; j++) covered[i][j] = 1; } double ans = 0.00; for(int i = 0; i < 2*n - 1; i++) for(int j = 0; j < 2*n - 1; j++) if(covered[i][j]) ans += (x[i + 1]-x[i]) * (y[j + 1]-y[j]); printf("%.2lf\n", ans); } return 0; }
相关文章推荐
- codevs 3044_矩形面积求并_离散
- Codevs 题目3044 矩形面积求并(线段树+扫描线+离散化)
- CodeVS3044矩形面积求并
- 【codevs 3044】【HDU 1542】【poj 1151】矩形面积并 线段树+‘扫描线’
- 【codevs 3044】 矩形面积求并 【线段树 扫描线 离散化】
- [CODEVS 3044] 矩形面积求并
- 【codevs 3044 矩形面积合并】【poj 1151 Atlantis】【hdu 1542 Atlantis】题意&题解&代码(c++)
- [codevs3044]矩形面积求并(线段树+扫描线)
- codves 3044 矩形面积求并
- codevs 3044 线段树+离散化+扫描线 (矩形面积并
- poj1151==codevs 3044 矩形面积求并
- codevs 3044 矩形面积求并 (扫描线)
- codevs3044 矩形面积求并
- 【离散化练习】Codevs3044矩形面积求并
- 矩形面积求并(codevs 3044)
- 3044矩形面积求并
- codevs3044 矩形面积求并(线段数+扫描线+离散化)
- 3044 矩形面积求并 - Wikioi
- 【codevs3044】矩形面积求并&&【POJ1151】Atlantis,第一次的扫描线
- codevs 3044 矩形面积求并