hdu 1255 覆盖的面积 矩形D层以上重叠面积
2012-08-10 22:45
477 查看
矩形面积并,求D层以上重叠的面积
离散化后扫描线 4000ms低效率水过
离散化后扫描线 4000ms低效率水过
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double EP=1e-8; const int maxn=2005; const int D=2; int n, cas=1; double hash[maxn]; struct nod{ double x; int c, id; }a[maxn]; struct node{ int lef, rig, mid, cover; }seg[4*maxn]; struct line{ int x1, x2, flag; //flag==1 down double y; }l[maxn]; void make_tree(int num, int lef, int rig){ seg[num].lef=lef; seg[num].rig=rig; seg[num].mid=(lef+rig)>>1; seg[num].cover=0; if(lef+1!=rig){ make_tree(num<<1, lef, seg[num].mid); make_tree(num*2+1, seg[num].mid, rig); } } void insert(int num, int lef, int rig, int cover){ if(seg[num].cover!=-1&&seg[num].lef==lef&&seg[num].rig==rig){ seg[num].cover+=cover; return; } if(seg[num].cover>0){ insert(num*2, seg[num*2].lef, seg[num*2].rig, seg[num].cover); insert(num*2+1, seg[num*2+1].lef, seg[num*2+1].rig, seg[num].cover); seg[num].cover=-1; } seg[num].cover=-1; if(rig<=seg[num].mid) insert(num*2, lef, rig, cover); else if(lef>=seg[num].mid) insert(num*2+1, lef, rig, cover); else { insert(num*2, lef, seg[num].mid, cover); insert(num*2+1, seg[num].mid, rig, cover); } } double cal(int num, int cover){ if(seg[num].cover>=cover) return hash[seg[num].rig]-hash[seg[num].lef]; if(seg[num].lef+1==seg[num].rig){ return 0; } return cal(num*2, cover)+cal(num*2+1, cover); } bool cmpx(nod p1, nod p2){ return p1.x<p2.x; } bool cmpid(nod p1, nod p2){ return p1.id<p2.id; } bool cmpy(line l1, line l2){ return l1.y<l2.y; } void myhash(){ int i; sort(a, a+2*n, cmpx); hash[0]=a[0].x; a[0].c=0; for(i=1; i<2*n; i++){ if(a[i].x-a[i-1].x<EP) a[i].c=a[i-1].c; else { a[i].c=a[i-1].c+1; hash[a[i].c]=a[i].x; } } sort(a, a+2*n, cmpid); for(i=0; i<n; i++){ l[i*2].x1=l[i*2+1].x1=a[i*2].c; l[i*2].x2=l[i*2+1].x2=a[i*2+1].c; } } void init(){ for(int i=0; i<n; i++){ scanf("%lf%lf%lf%lf", &a[i*2].x, &l[i*2].y, &a[i*2+1].x, &l[i*2+1].y); l[i*2].flag=1;l[i*2+1].flag=-1; a[i*2].id=i*2;a[i*2+1].id=i*2+1; } } void solve(){ make_tree(1, 0, 2*n); myhash(); sort(l, l+2*n, cmpy); double ans=0; for(int i=0; i<2*n-1; i++){ insert(1, l[i].x1, l[i].x2, l[i].flag); ans+=cal(1, D)*(l[i+1].y-l[i].y); } printf("%.2f\n", ans); } int main(){ //freopen("1.txt", "r", stdin); int T; scanf("%d", &T); while(T--){ scanf("%d", &n); init(); solve(); } return 0; }
相关文章推荐
- hdu1255 扫描线,矩形重叠面积(两次以上)
- HDU 1255 覆盖的面积(矩形面积交)
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
- HDU 1255 矩形覆盖面积(线段树)
- HDU 1255 覆盖的面积(线段树求矩形面积交)
- HDU 1255 覆盖的面积,矩形面积交
- hdoj 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 覆盖的面积 覆盖的矩形面积并