hdu 1255 矩形面积覆盖次数
2012-11-01 15:07
429 查看
很简单的扫描线,一开始没初始化,wa了一次。
Accode:
Accode:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using std::sort; using std::unique; const int size=1111; struct Line { double lx,rx,y; int f; Line(){} Line(double a,double b,double c,int d): lx(a),rx(b),y(c),f(d){} bool operator < (const Line &cmp) const{ return y<cmp.y; } }line[size<<1]; double cov[size<<3],len1[size<<3],len2[size<<3]; double X[size<<1]; void PushUp(int rt,int l,int r) { if (cov[rt]>=2) { len2[rt]=X[r+1]-X[l]; len1[rt]=0; } else if (cov[rt]) { if (l==r) { len1[rt]=X[r+1]-X[l]; len2[rt]=0; } else { len2[rt]=len1[rt<<1]+len1[rt<<1|1]+len2[rt<<1]+len2[rt<<1|1]; len1[rt]=X[r+1]-X[l]-len2[rt]; } } else if (l==r) len1[rt]=len2[rt]=0; else { len2[rt]=len2[rt<<1]+len2[rt<<1|1]; len1[rt]=len1[rt<<1]+len1[rt<<1|1]; } } void update(int rt,int l,int r,int L,int R,int v) { if (L<=l&&r<=R) { cov[rt]+=v; PushUp(rt,l,r); return ; } int m=(l+r)>>1; if (L<=m) update(rt<<1,l,m,L,R,v); if (R>m) update(rt<<1|1,m+1,r,L,R,v); PushUp(rt,l,r); } int Fin(double key,int k) { int l=0,r=k; while (l<=r) { int m=(l+r)>>1; if (X[m]==key) return m; else if (X[m]<key) l=m+1; else r=m-1; } return -1; } int main() { int T,n,i,k,m,l,r; double x1,x2,y1,y2,ans; scanf("%d",&T); while (T--) { scanf("%d",&n); for (m=i=0;i<n;i++) { scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); X[m]=x1; X[m+1]=x2; line[m++]=Line(x1,x2,y1,1); line[m++]=Line(x1,x2,y2,-1); } sort(X,X+m); sort(line,line+m); k=unique(X,X+m)-X-1; memset(cov,0,sizeof(cov)); memset(len1,0,sizeof(len1)); memset(len2,0,sizeof(len2)); for (ans=i=0;i<m-1;i++) { l=Fin(line[i].lx,k); r=Fin(line[i].rx,k)-1; if (l<=r) update(1,0,k,l,r,line[i].f); ans+=len2[1]*(line[i+1].y-line[i].y); } printf("%.2lf\n",ans); } return 0; }
相关文章推荐
- 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-1255 覆盖的面积 (线段树 求矩形覆盖面积)
- hdu 1255 覆盖的面积 求矩形面积交
- hdu 1255 覆盖的面积 矩形D层以上重叠面积
- Hdu 1542 Atlantis + Hdu 1255 覆盖的面积 (线段树矩形面积并)