标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8327 Accepted Submission(s): 3627
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <queue> 7 #include <cmath> 8 #include <set> 9 using namespace std; 10 11 #define N 105 12 #define ll root<<1 13 #define rr root<<1|1 14 #define mid (a[root].l+a[root].r)/2 15 16 int max(int x,int y){return x>y?x:y;} 17 int min(int x,int y){return x<y?x:y;} 18 int abs(int x,int y){return x<0?-x:x;} 19 20 struct node{ 21 int l, r; 22 double sum; 23 int val; 24 }a[N*8]; 25 26 struct Line{ 27 double x1, x2, y; 28 int val; 29 Line(){} 30 Line(double a,double b,double c,int d){ 31 x1=a; 32 x2=b; 33 y=c; 34 val=d; 35 } 36 }line[N*2]; 37 38 bool cmp(Line a,Line b){ 39 return a.y<b.y; 40 } 41 int n, m; 42 double xx[N*2]; 43 44 int b_s(double key){ 45 int l=1, r=m; 46 while(l<=r){ 47 int mm=(l+r)/2; 48 if(xx[mm]==key) return mm; 49 else if(xx[mm]>key) r=mm-1; 50 else if(xx[mm]<key) l=mm+1; 51 } 52 } 53 54 void build(int l,int r,int root){ 55 a[root].l=l; 56 a[root].r=r; 57 a[root].sum=a[root].val=0; 58 if(l==r) return; 59 build(l,mid,ll); 60 build(mid+1,r,rr); 61 } 62 63 void up(int root){ 64 if(a[root].val) a[root].sum=xx[a[root].r+1]-xx[a[root].l]; 65 else if(a[root].l==a[root].r) a[root].sum=0; 66 else a[root].sum=a[ll].sum+a[rr].sum; 67 68 } 69 70 void update(int l,int r,int val,int root){ 71 if(a[root].l==l&&a[root].r==r){ 72 a[root].val+=val; 73 up(root); 74 return; 75 } 76 if(l>=a[rr].l) update(l,r,val,rr); 77 else if(r<=a[ll].r) update(l,r,val,ll); 78 else{ 79 update(l,mid,val,ll); 80 update(mid+1,r,val,rr); 81 } 82 up(root); 83 } 84 85 main() 86 { 87 int i, j, k; 88 double x1, y1, x2, y2; 89 int kase=1; 90 while(scanf("%d",&n)==1&&n){ 91 m=1;k=0; 92 for(i=0;i<n;i++){ 93 scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); 94 line[k++]=Line(x1,x2,y1,1); 95 line[k++]=Line(x1,x2,y2,-1); 96 xx[m++]=x1;xx[m++]=x2; 97 } 98 sort(xx+1,xx+m); 99 m=unique(xx+1,xx+m)-xx-1; 100 sort(line,line+k,cmp); 101 build(1,m,1); 102 double ans=0.0; 103 for(i=0;i<k-1;i++){ 104 update(b_s(line[i].x1),b_s(line[i].x2)-1,line[i].val,1); 105 ans+=a[1].sum*(line[i+1].y-line[i].y); 106 } 107 printf("Test case #%d\n",kase++); 108 printf("Total explored area: %.2f\n\n",ans); 109 } 110 }
标签:
原文地址:http://www.cnblogs.com/qq1012662902/p/4622066.html