标签:name 开始 roc 线段树 eof seve div section end
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解。现在来水一水博客,写一下若干年前的题目的题解。
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21978 Accepted Submission(s): 8714
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=2e4+10; 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 8 int cnt[maxn<<2]; 9 double sum[maxn<<2],f[maxn]; 10 11 void init() 12 { 13 memset(cnt,0,sizeof cnt); 14 memset(sum,0,sizeof sum); 15 } 16 17 struct node{ 18 double h,l,r; 19 int s; 20 21 node(){} 22 23 node(double a,double b,double c,int d):l(a),r(b),h(c),s(d){} 24 25 bool operator<(const node&cmp){ 26 return h<cmp.h; 27 } 28 29 }line[maxn]; 30 31 void pushup(int rt,int l,int r) 32 { 33 if(cnt[rt]){//解决线段重复问题,如果当前区间有标记,那么就用f数组进行更新,不是左右儿子更新 34 sum[rt]=f[r+1]-f[l]; 35 } 36 else if(l==r){ 37 sum[rt]=0; 38 } 39 else{ 40 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 41 } 42 } 43 44 void update(int L,int R,int c,int l,int r,int rt) 45 { 46 if(L<=l&&r<=R){ 47 cnt[rt]+=c; 48 pushup(rt,l,r); 49 return ; 50 } 51 52 int m=(l+r)>>1; 53 if(L<=m) update(L,R,c,lson); 54 if(R> m) update(L,R,c,rson); 55 pushup(rt,l,r); 56 } 57 58 int main() 59 { 60 int n,cas=1; 61 while(~scanf("%d",&n)&&n){ 62 int h=0; 63 for(int i=1;i<=n;i++){//从下往上扫 64 double a,b,c,d; 65 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 66 f[h]=a; 67 line[h++]=node(a,c,b,1);//标记入边 68 f[h]=c; 69 line[h++]=node(a,c,d,-1);//标记出边 70 } 71 sort(f,f+h); 72 sort(line,line+h); 73 int d=unique(f,f+h)-f;//离散化 74 init(); 75 double ret=0; 76 for(int i=0;i<h-1;i++){//因为每一个点代表的是线段,0代表0-1这一段,所以是查询的时候-1 77 int l=lower_bound(f,f+d,line[i].l)-f;//直接用下标进行操作 78 int r=lower_bound(f,f+d,line[i].r)-f; 79 r--;//因为线段树上点代表线段,从i到i+1这一段,所以查询的时候,右边要-1 80 if(l<=r) update(l,r,line[i].s,0,d-1,1); 81 ret+=sum[1]*(line[i+1].h-line[i].h); 82 } 83 printf("Test case #%d\n",cas++); 84 printf("Total explored area: %.2f\n\n",ret); 85 } 86 return 0; 87 }
开溜。
HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
标签:name 开始 roc 线段树 eof seve div section end
原文地址:https://www.cnblogs.com/ZERO-/p/10982343.html