设为首页 加入收藏

TOP

HDU-1255-覆盖的面积(线段树)
2015-07-24 05:40:49 来源: 作者: 【 】 浏览:4
Tags:HDU-1255- 覆盖 面积 线段

Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.

\


Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000.

注意:本题的输入数据较多,推荐使用scanf读入数据.

Output 对于每组测试数据,请计算出被这些矩形覆盖过至少两次的区域的面积.结果保留两位小数.

Sample Input
2
5
1 1 4 2
1 3 3 7
2 1.5 5 4.5
3.5 1.25 7.5 4
6 3 10 7
3
0 0 1 1
1 0 2 1
2 0 3 1

Sample Output
7.63
0.00

Author Ignatius.L & weigang Lee


思路:把所有矩形的垂直于y轴的边记录下来再按x坐标从小到大排序,再把y坐标记录下来按从小到大排序,建树的时候把y坐标赋给节点,更新的时候维护区间的重叠次数,然后再求面积 node[1].m*(l[i].x-l[i-1].x) ,i为当前未被放进树里面的边。


#include 
  
   
#include 
   
     #include 
    
      using namespace std; struct L{ int val;//1代表是左边的垂直y轴的边,-1代表是右边的垂直y轴的边 double x,y1,y2; }l[2000]; struct N{ double l,r,o,m;//o为重叠一次的长度,m为重叠多次的长度 int cnt;//记录重叠情况 }node[8000]; double tempy[2000]; bool cmp(struct L a,struct L b) { return a.x
     
      >1; build(idx<<1,s,mid); build(idx<<1|1,mid,e); } } void len(int idx,int s,int e) { if(node[idx].cnt>=2) node[idx].m=node[idx].r-node[idx].l;//两次以上 else if(node[idx].cnt==1)//一次 { node[idx].o=node[idx].r-node[idx].l; if(s+1!=e) { node[idx].m=node[idx<<1].o+node[idx<<1|1].o; } else node[idx].m=0; } else { if(s+1!=e) { node[idx].m=node[idx<<1].m+node[idx<<1|1].m; node[idx].o=node[idx<<1].o+node[idx<<1|1].o; } else node[idx].m=node[idx].o=0; } } void update(int idx,int s,int e,struct L line) { if(node[idx].l==line.y1 && node[idx].r==line.y2) { node[idx].cnt+=line.val; len(idx,s,e); return; } if(s+1!=e) { int mid=(s+e)>>1; if(line.y2<=node[idx<<1].r) update(idx<<1,s,mid,line); else if(line.y1>=node[idx<<1|1].l) update(idx<<1|1,mid,e,line); else { double temp=line.y2; line.y2=node[idx<<1].r; update(idx<<1,s,mid,line); line.y2=temp; line.y1=node[idx<<1|1].l; update(idx<<1|1,mid,e,line); } } len(idx,s,e); } int main() { int T,n,i; double x1,x2,y1,y2; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i
      
       1) ans+=node[1].m*(l[i].x-l[i-1].x); update(1,1,n*2,l[i]); } printf("%.2lf\n",ans); } } 
      
     
    
   
  



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 4770 Lights Against Dudely(.. 下一篇NYOJ 737 合并石子(一)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: