hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255
求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1次的长度变量即可
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int maxn=2020; 8 class node 9 { 10 public: 11 int l,r; 12 int c; 13 double cnt; 14 double more ;//表示被覆盖次数大于一次的长度 15 double lf,rf; 16 }; 17 node segTree[maxn*3]; 18 class line 19 { 20 public: 21 double x,y1,y2; 22 int f; 23 }; 24 line le[maxn*2]; 25 bool cmp(line a, line b) 26 { 27 return a.x< b.x; 28 } 29 double y[maxn*2]; 30 31 void build(int num,int l, int r) 32 { 33 segTree[num].l=l; 34 segTree[num].r=r; 35 segTree[num].cnt=0; 36 segTree[num].more==0; 37 segTree[num].lf=y[l]; 38 segTree[num].rf=y[r]; 39 if(l+1==r) return; 40 int mid=(l+r)/2; 41 build(num*2,l,mid); 42 build(num*2+1,mid,r); 43 44 } 45 46 void calen(int num) 47 { 48 if(segTree[num].c >=2) 49 { 50 segTree[num].more=segTree[num].cnt=segTree[num].rf-segTree[num].lf; 51 return ; 52 } 53 else if(segTree[num].c==1) 54 { 55 segTree[num].cnt=segTree[num].rf-segTree[num].lf; 56 if(segTree[num].l+1 ==segTree[num].r) segTree[num].more=0; 57 else segTree[num].more=segTree[num*2].cnt+segTree[num*2+1].cnt; 58 } 59 else 60 { 61 if(segTree[num].l+1 ==segTree[num].r ) 62 { 63 segTree[num].cnt=segTree[num].more=0; 64 } 65 else 66 { 67 segTree[num].cnt=segTree[num*2].cnt+segTree[num*2+1].cnt; 68 segTree[num].more=segTree[num*2].more+segTree[num*2+1].more; 69 } 70 } 71 } 72 void update(int num, line e) 73 { 74 if(e.y1 == segTree[num].lf && e.y2==segTree[num].rf) 75 { 76 segTree[num].c+=e.f; 77 calen(num); 78 return ; 79 } 80 if(e.y2 <= segTree[num*2].rf) update(num*2,e); 81 else if(e.y1 >= segTree[num*2+1].lf) update(num*2+1,e); 82 else 83 { 84 line temp=e; 85 temp.y2=segTree[num*2].rf; 86 update(num*2,temp); 87 temp=e; 88 temp.y1=segTree[num*2+1].lf; 89 update(num*2+1,temp); 90 } 91 calen(num); 92 } 93 int main() 94 { 95 int t; 96 int n; 97 double x1,x2,y1,y2; 98 99 scanf("%d",&t); 100 while(t--) 101 { 102 scanf("%d",&n); 103 int num=1; 104 for(int i=1;i<=n;i++) 105 { 106 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 107 le[num].x=x1; 108 le[num].y1=y1; 109 le[num].y2=y2; 110 le[num].f=1; 111 y[num]=y1; 112 num++; 113 le[num].x=x2; 114 le[num].y1=y1; 115 le[num].y2=y2; 116 le[num].f=-1; 117 y[num]=y2; 118 num++; 119 } 120 sort(le+1,le+num,cmp); 121 sort(y+1,y+num); 122 build(1,1,num-1); 123 update(1,le[1]); 124 double ans=0; 125 for(int i=2;i<num;i++) 126 { 127 ans+=segTree[1].more*(le[i].x - le[i-1].x); 128 update(1,le[i]); 129 } 130 printf("%.2lf\n",ans); 131 } 132 return 0; 133 134 }