http://acm.hdu.edu.cn/showproblem.php?pid=1542

面积并

 1 #include<bits/stdc++.h>
 2 #define maxn 100005
 3 #define lson l,mid,rt<<1
 4 #define rson mid+1,r,rt<<1|1
 5 #define pb push_back
 6 using namespace std;
 7 
 8 double tree[maxn<<2];
 9 int lazy[maxn<<2];
10 vector<double>ve;
11 
12 struct seg{
13     double l,r,h;
14     int flag;
15     seg(){}
16     seg(double _l,double _r,double _h,int _flag){
17         l=_l,r=_r,h=_h,flag=_flag;
18     }
19     bool operator<(const seg &b)const{
20         return h<b.h;
21     }
22 }s[maxn];
23 
24 void push_up(int l,int r,int rt){
25     if(lazy[rt]){
26         tree[rt]=ve[r]-ve[l-1];
27     }
28     else if(l==r){
29         tree[rt]=0;
30     }
31     else{
32         tree[rt]=tree[rt<<1]+tree[rt<<1|1];
33     }
34 }
35 
36 void build(int l,int r,int rt){
37     tree[rt]=0,lazy[rt]=0;
38     if(l==r) return;
39     int mid=l+r>>1;
40     build(lson);
41     build(rson);
42 }
43 
44 void add(int L,int R,int v,int l,int r,int rt){
45     if(L<=l&&R>=r){
46         lazy[rt]+=v;
47         push_up(l,r,rt);
48         return;
49     }
50     int mid=l+r>>1;
51     if(L<=mid) add(L,R,v,lson);
52     if(R>mid) add(L,R,v,rson);
53     push_up(l,r,rt);
54 }
55 
56 int getid(double x){
57     return lower_bound(ve.begin(),ve.end(),x)-ve.begin()+1;
58 }
59 
60 int main(){
61     int n;
62     int Case=1;
63     while(~scanf("%d",&n)){
64         if(!n) break;
65         ve.clear();
66         int tot=0;
67         double x1,y1,x2,y2;
68         for(int i=1;i<=n;i++){
69             scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
70             ve.pb(x1),ve.pb(x2);
71             s[++tot]=seg(x1,x2,y1,1);
72             s[++tot]=seg(x1,x2,y2,-1);
73         }
74         sort(ve.begin(),ve.end());
75         ve.erase(unique(ve.begin(),ve.end()),ve.end());
76         sort(s+1,s+tot+1);
77         int N=ve.size();
78         build(1,N,1);
79         double ans=0;
80         for(int i=1;i<tot;i++){
81             int L=getid(s[i].l);
82             int R=getid(s[i].r)-1;
83             add(L,R,s[i].flag,1,N,1);
84             ans+=tree[1]*(s[i+1].h-s[i].h);
85         }
86         printf("Test case #%d\n",Case++);
87         printf("Total explored area: %.2f\n\n",ans);
88     }
89 }
View Code

相关文章:

  • 2021-08-05
  • 2022-12-23
  • 2022-12-23
  • 2022-03-04
  • 2022-12-23
  • 2022-02-18
  • 2022-12-23
猜你喜欢
  • 2021-08-25
  • 2021-12-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-16
相关资源
相似解决方案