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(线段树+扫描线)的主要内容,如果未能解决你的问题,请参考以下文章

hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

hdu 1542 线段树之扫描线之面积并

hdu1542线段树(扫描线+离散化)

HDU 3265 Posters ——(线段树+扫描线)

HDU 1255 覆盖的面积 ——(线段树+扫描线)

HDU 1255 覆盖的面积(线段树:扫描线求面积并)