ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线段树求面积并,面积交,周长

2019-05-11 11:51:39  阅读:240  来源: 互联网

标签:rt ve int double 线段 面积 seg flag 树求


 

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

 

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

面积交

  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],tree2[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 push_up2(int l,int r,int rt){
 37     if(lazy[rt]>1){
 38         tree2[rt]=ve[r]-ve[l-1];
 39     }
 40     else if(l==r){
 41         tree2[rt]=0;
 42     }
 43     else if(lazy[rt]==1){
 44         tree2[rt]=tree[rt<<1]+tree[rt<<1|1];
 45     }
 46     else{
 47         tree2[rt]=tree2[rt<<1]+tree2[rt<<1|1];
 48     }
 49 }
 50 
 51 void build(int l,int r,int rt){
 52     tree[rt]=0,lazy[rt]=0;
 53     if(l==r) return;
 54     int mid=l+r>>1;
 55     build(lson);
 56     build(rson);
 57 }
 58 
 59 void add(int L,int R,int v,int l,int r,int rt){
 60     if(L<=l&&R>=r){
 61         lazy[rt]+=v;
 62         push_up(l,r,rt);
 63         push_up2(l,r,rt);
 64         return;
 65     }
 66     int mid=l+r>>1;
 67     if(L<=mid) add(L,R,v,lson);
 68     if(R>mid) add(L,R,v,rson);
 69     push_up(l,r,rt);
 70     push_up2(l,r,rt);
 71 }
 72 
 73 int getid(double x){
 74     return lower_bound(ve.begin(),ve.end(),x)-ve.begin()+1;
 75 }
 76 
 77 int main(){
 78     int n;
 79     int Case=1;
 80     int T;
 81     scanf("%d",&T);
 82     while(T--){
 83         scanf("%d",&n);
 84         ve.clear();
 85         int tot=0;
 86         double x1,y1,x2,y2;
 87         for(int i=1;i<=n;i++){
 88             scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
 89             ve.pb(x1),ve.pb(x2);
 90             s[++tot]=seg(x1,x2,y1,1);
 91             s[++tot]=seg(x1,x2,y2,-1);
 92         }
 93         sort(ve.begin(),ve.end());
 94         ve.erase(unique(ve.begin(),ve.end()),ve.end());
 95         sort(s+1,s+tot+1);
 96         int N=ve.size();
 97         build(1,N,1);
 98         double ans=0;
 99         for(int i=1;i<tot;i++){
100             int L=getid(s[i].l);
101             int R=getid(s[i].r)-1;
102             add(L,R,s[i].flag,1,N,1);
103             ans+=tree2[1]*(s[i+1].h-s[i].h);
104         }
105         printf("%.2f\n",ans);
106     }
107 }
View Code

 

标签:rt,ve,int,double,线段,面积,seg,flag,树求
来源: https://www.cnblogs.com/Fighting-sh/p/10848136.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有