【线段树 && 扫描线 && 面积交】HDU - 1255 覆盖的面积
2017-09-05 10:54
549 查看
Problem Dscription
给你n个矩形,每个矩形给你左下角下标和右上角下面,让你求面积交。
思路:
参考博客:http://www.cnblogs.com/scau20110726/archive/2013/04/14/3020998.html,建议先做了hdu 1542再看这题。代码只是轻微的改动了而已。
线段树维护区间cover>=2的len2,cover>0的len,还有区间整段是否有效的cover。和hdu 1542相比就是多了个len2。所以就get_len2()这个函数发生了改变,具体详解参考上述博客,讲的挺详细的。
给你n个矩形,每个矩形给你左下角下标和右上角下面,让你求面积交。
思路:
参考博客:http://www.cnblogs.com/scau20110726/archive/2013/04/14/3020998.html,建议先做了hdu 1542再看这题。代码只是轻微的改动了而已。
线段树维护区间cover>=2的len2,cover>0的len,还有区间整段是否有效的cover。和hdu 1542相比就是多了个len2。所以就get_len2()这个函数发生了改变,具体详解参考上述博客,讲的挺详细的。
#include<bits/stdc++.h> using namespace std; #define lson root<<1 #define rson root<<1|1 #define N 1005 #define MID int mid = (l + r) / 2 struct node { int cover; double len, len2;//不一样的地方多了len2 }; node tree[N<<3]; double yy[N<<2]; struct Node { int cover; double x; double yd, yu; bool operator < (const Node &b) const{ return x < b.x; } }; Node a[N<<2]; void build(int root, int l, int r) { tree[root].cover = tree[root].len = tree[root].len2 = 0; if(l + 1 == r) return; MID; build(lson, l, mid); build(rson, mid, r); } void get_len2(int root, int l, int r) { if(tree[root].cover) tree[root].len = yy[r] - yy[l]; else if(l + 1 == r) tree[root].len = 0; else tree[root].len = tree[lson].len + tree[rson].len; //下面是不一样的地方 if(tree[root].cover > 1) tree[root].len2 = yy[r] - yy[l];//cover>=2区间整段长度都是有效 else if(l + 1 == r) tree[root].len2 = 0;//叶子结点,同时区间整段不有效 else if(tree[root].cover == 1)//加上左右孩子的len,就满足len2了 tree[root].len2 = tree[lson].len + tree[rson].len; else tree[root].len2 = tree[lson].len2 + tree[rson].len2;//左右孩子len2的和 // } void updata(int root, int l, int r, int ul, int ur, int cover) { if(ul <= l && r <= ur) { tree[root].cover += cover; get_len2(root, l, r); return; } MID; if(ul < mid) updata(lson, l, mid, ul, ur, cover); if(ur > mid) updata(rson, mid, r, ul, ur, cover); get_len2(root, l, r); } int main() { int n, cnt, i, T; double x1, x2, y1, y2; scanf("%d", &T); while(T--) { scanf("%d", &n); cnt = 0; for(i = 0; i < n; i++) { scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2); yy[cnt] = y1; a[cnt++] = ((Node){1, x1, y1, y2}); yy[cnt] = y2; a[cnt++] = ((Node){-1, x2, y1, y2}); } sort(yy, yy + cnt); n = unique(yy, yy + cnt) - yy; build(1, 0, n - 1); sort(a, a + cnt); int ul, ur; double ans = 0; for(i = 0; i < cnt - 1; i++) { ul = lower_bound(yy, yy + n, a[i].yd) - yy; ur = lower_bound(yy, yy + n, a[i].yu) - yy; updata(1, 0, n - 1, ul, ur, a[i].cover); ans += tree[1].len2 * (a[i + 1].x - a[i].x); } printf("%.2lf\n", ans); } }
相关文章推荐
- HDU-1255 覆盖的面积(线段树扫描线模板+离散化+加点修改题)
- HDU 1255 覆盖的面积 线段树+扫描线求面积并
- hdu 1255 覆盖的面积 (线段树扫描线 计算两次覆盖的面积)
- 线段树 扫描线 HDU 1255 覆盖的面积
- HDU 1255 覆盖的面积(线段树+扫描线求面积【升级版】)
- HDU 1255 覆盖的面积 (线段树 + 离散化 + 扫描线)
- HDU 1255 覆盖的面积 线段树 扫描线
- 【 HDU 1255】 覆盖的面积(矩阵面积交,线段树,扫描法)
- HDU - 1255 覆盖的面积(线段树 + 扫描线)
- HDU 1255 - 覆盖的面积 (线段树 扫描线 面积交)
- HDU 1255 覆盖的面积(线段树扫描线求面积的交)
- 覆盖的面积 HDU - 1255 线段树-扫描线
- HDU - 1255 覆盖的面积(线段树 扫描线)
- hdu 1255 覆盖的面积 (线段树 扫描线)
- HDU-1255 覆盖的面积 线段树 + 扫描线
- hdu 1255 覆盖的面积 线段树扫描线求重叠面积
- 算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828)
- HDU 1255 覆盖的面积[离散化 + 扫描线 + 线段树]
- hdu 1255 覆盖的面积(线段树|扫描线)
- HDU 1255 覆盖的面积[离散化 + 扫描线 + 线段树]