hdu5091(线段树+扫描线)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5091(线段树+扫描线)相关的知识,希望对你有一定的参考价值。
题目连接:HDU - 5091
比较少写这类问题,要多练习。。,
参考:http://www.cnblogs.com/tsw123/p/4470115.html
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 const int maxn=40010; 7 using namespace std; 8 9 struct LINE 10 { 11 int x,y1,y2,v; 12 LINE(){} 13 LINE(int x,int y1,int y2,int v): 14 x(x),y1(y1),y2(y2),v(v){} 15 bool operator<(const LINE&a)const 16 { 17 return x<a.x||x==a.x&&v>a.v; 18 } 19 }line[maxn]; 20 21 int Y[maxn];//离散 22 int ct; 23 int n,w,h; 24 25 int sum[maxn<<2],add[maxn<<2]; 26 27 void pushup(int rt) 28 { 29 sum[rt]=max(sum[rt<<1],sum[rt<<1|1]); 30 } 31 void build(int l,int r,int rt) 32 { 33 sum[rt]=add[rt]=0; 34 if(l==r) return ;// 35 int m=(l+r)>>1; 36 build(lson); 37 build(rson); 38 pushup(rt); 39 } 40 void pushdown(int rt) 41 { 42 if(add[rt]) 43 { 44 add[rt<<1]+=add[rt]; 45 add[rt<<1|1]+=add[rt]; 46 sum[rt<<1]+=add[rt]; 47 sum[rt<<1|1]+=add[rt]; 48 add[rt]=0; 49 } 50 } 51 void update(int L,int R,int v,int l,int r,int rt) 52 { 53 if(L<=l&&r<=R) 54 { 55 add[rt]+=v; 56 sum[rt]+=v; 57 return ;// 58 } 59 pushdown(rt); 60 int m=(l+r)>>1; 61 if(L<=m) update(L,R,v,lson); 62 if(R>m) update(L,R,v,rson); 63 pushup(rt); 64 } 65 int query(int L,int R,int l,int r,int rt) 66 { 67 if(L<=l&&r<=R) 68 { 69 return sum[rt]; 70 } 71 pushdown(rt); 72 int m=(l+r)>>1; 73 int ans=0; 74 if(L<=m) ans+=query(L,R,lson); 75 if(R>m) ans+=query(L,R,rson); 76 return ans; 77 } 78 int main() 79 { 80 while(scanf("%d",&n)&&n!=-1) 81 { 82 ct=0; 83 scanf("%d%d",&w,&h); 84 for(int i=0;i<n;i++) 85 { 86 int x,y; 87 scanf("%d%d",&x,&y); 88 x+=20001;// 89 y+=20001;// 90 Y[ct]=y; 91 line[ct++]=LINE(x,y,y+h,1); 92 Y[ct]=y+h; 93 line[ct++]=LINE(x+w,y,y+h,-1); 94 } 95 sort(Y,Y+ct); 96 sort(line,line+ct); 97 int num=unique(Y,Y+ct)-Y;// 98 build(0,num-1,1); 99 int ans=0; 100 for(int i=0;i<ct;i++) 101 { 102 int l=lower_bound(Y,Y+num,line[i].y1)-Y;// 103 int r=lower_bound(Y,Y+num,line[i].y2)-Y;// 104 update(l,r,line[i].v,0,num-1,1); 105 ans=max(ans,query(0,num-1,0,num-1,1));//此处可以省去query,直接写ans=max(ans,sum[1]);也行 106 } 107 printf("%d\\n",ans); 108 } 109 }
以上是关于hdu5091(线段树+扫描线)的主要内容,如果未能解决你的问题,请参考以下文章