POJ 1177 Picture(求周长并)
2013-08-10 19:26
302 查看
题目链接
看的HH的题解。。周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段。
看的HH的题解。。周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <algorithm> using namespace std; #define maxn 10000 #define lson l , m, rt<<1 #define rson m+1, r,rt<<1|1 int que[maxn*4]; int sum[maxn*4]; int cnt[maxn*4]; bool lbd[maxn*4] , rbd[maxn*4]; int numseg[maxn*4]; struct node { int lx,rx,y; int s; node() {} node(int a,int b,int c,int d):lx(a),rx(b),y(c),s(d) {} bool operator < (const node &S) const { if(y == S.y) return s > S.s; return y < S.y; } } mat[maxn]; int bin(int x,int n) { int str,end,mid; str = 0,end = n; while(str <= end) { mid = (str+end)/2; if(que[mid] == x) return mid; else if(que[mid] > x) end = mid - 1; else str = mid + 1; } return mid; } void pushup(int rt,int l,int r) { if(cnt[rt]) { lbd[rt] = rbd[rt] = 1; sum[rt] = que[r+1] - que[l]; numseg[rt] = 2; } else if (l == r) { sum[rt] = numseg[rt] = lbd[rt] = rbd[rt] = 0; } else { lbd[rt] = lbd[rt<<1]; rbd[rt] = rbd[rt<<1|1]; sum[rt] = sum[rt<<1] + sum[rt<<1|1]; numseg[rt] = numseg[rt<<1] + numseg[rt<<1|1]; if (lbd[rt<<1|1] && rbd[rt<<1]) numseg[rt] -= 2; } } void update(int L,int R,int c,int l,int r,int rt) { if(L <= l&&r <= R) { cnt[rt] += c; pushup(rt,l,r); return ; } int m = (l+r)>>1; if(L <= m) update(L,R,c,lson); if(R > m) update(L,R,c,rson); pushup(rt,l,r); } int main() { int n,num,i,l,r; int a,b,c,d; while(scanf("%d",&n)!=EOF) { if(!n) break; num = 0; for(i = 0; i < n; i ++) { scanf("%d%d%d%d",&a,&b,&c,&d); que[num] = a; mat[num ++] = node(a,c,b,1); que[num] = c; mat[num ++] = node(a,c,d,-1); } sort(que,que+num); sort(mat,mat+num); int k = 1; for(i = 1; i < num; i ++) { if(que[i] != que[i-1]) que[k++] = que[i]; } int ans = 0,last = 0; memset(cnt,0,sizeof(cnt)); memset(sum,0,sizeof(sum)); memset(lbd,0,sizeof(lbd)); memset(rbd,0,sizeof(rbd)); for(i = 0; i < num; i ++) { l = bin(mat[i].lx,k-1); r = bin(mat[i].rx,k-1)-1; if(l <= r) update(l,r,mat[i].s,0,k-1,1); ans += numseg[1] * (mat[i+1].y - mat[i].y); ans += abs(sum[1] - last); last = sum[1]; } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 1177 Picture(线段树+离散化 求周长)
- poj 1177 Picture(扫描线+矩形周长并)
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
- poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)
- poj1177 Picture 矩形周长并
- N - Picture - poj 1177(扫描线求周长)
- poj 1177 Picture 【线段树 扫描线 求轮廓周长】
- POJ 1177 Picture【矩形周长并】
- POJ-1177 Picture (线段树 求矩形周长)
- POJ 1177 & HDU 1828 Picture(扫描线 + 求周长)
- POJ-1177 Picture 矩形覆盖周长并
- POJ-1177-Picture(线段树+扫描线+离散化)[矩形周长并]
- hdu 1828 / poj/pku 1177(Picture)(线段树求矩形覆盖面周长)
- poj 1177 Picture(线段树求矩形周长并)
- POJ 1177 Picture 矩形周长并
- poj 1177 & hdu 1828 Picture 线段树 扫描线求矩形周长并
- POJ 1177 Picture(扫描线求周长)
- Picture - POJ 1177 扫描线 矩阵合并的周长
- poj-1177 Picture(矩形周长并,线段树+扫描线)
- 求矩形并的周长 poj 1177 picture