1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 #define L(rt) rt<<1 7 #define R(rt) rt<<1|1 8 #define lson l,mid,rt<<1 9 #define rson mid+1,r, rt<<1|1 10 #define MAXN 10010 11 using namespace std; 12 13 struct node1//扫描线,以点(x,y1)为线段的下端点 14 { 15 long long x,y1,y2,val; 16 }seg[MAXN<<1]; 17 18 struct node2 19 { 20 long long l,r; 21 long long add,sum; 22 }tree[MAXN<<3]; 23 24 long long y[MAXN<<1];//为了去重 25 bool cmp(node1 a,node1 b) 26 { 27 if(a.x!=b.x) 28 return a.x<b.x; 29 return a.val>b.val; 30 } 31 32 void build(long long l,long long r,int rt) 33 { 34 tree[rt].l=l; 35 tree[rt].r=r; 36 tree[rt].sum=tree[rt].add=0; 37 if(l==r) 38 return; 39 long long mid=(l+r)>>1; 40 build(lson); 41 build(rson); 42 } 43 void push(int rt) 44 { 45 tree[L(rt)].sum+=tree[rt].add; 46 tree[L(rt)].add+=tree[rt].add; 47 tree[R(rt)].sum+=tree[rt].add; 48 tree[R(rt)].add+=tree[rt].add; 49 tree[rt].add=0; 50 } 51 52 void update(long long val,long long l,long long r,int rt) 53 { 54 if(l==y[tree[rt].l]&&r==y[tree[rt].r]) 55 { 56 tree[rt].add+=val; 57 tree[rt].sum+=val; 58 return ; 59 } 60 if(tree[rt].l==tree[rt].r) 61 return; 62 if(tree[rt].add) 63 push(rt); 64 int mid=(tree[rt].l+tree[rt].r)>>1; 65 if(r<=y[mid]) 66 update(val,l,r,L(rt)); 67 else 68 if(l>=y[mid+1]) 69 update(val,l,r,R(rt)); 70 else 71 { 72 update(val,l,y[mid],L(rt)); 73 update(val,y[mid+1],r,R(rt)); 74 } 75 tree[rt].sum=max(tree[L(rt)].sum,tree[R(rt)].sum);//此处应该是最大,而不是和 76 } 77 78 int main() 79 { 80 int n,w,h; 81 while(~scanf("%d%d%d",&n,&w,&h)){ 82 for(int i=0;i<n;i++){ 83 scanf("%I64d%I64d%I64d",&seg[i].x,&seg[i].y1,&seg[i].val); 84 y[i*2+1]=seg[i].y1; 85 y[i*2+2]=seg[i].y1+h-1; 86 seg[i].y2=seg[i].y1+h-1; 87 seg[n+i]=seg[i]; 88 seg[n+i].x=seg[i].x+w-1; 89 seg[n+i].val=-seg[i].val; //出边的val为负,表不在这矩形里 90 } 91 sort(y+1,y+2*n+1); 92 sort(seg,seg+2*n,cmp); 93 int cnt=unique(y+1,y+2*n+1)-y-1; //unique 去重函数 94 build(1,cnt,1); 95 long long ans=0; 96 for(int i=0;i<2*n;i++){ 97 update(seg[i].val,seg[i].y1,seg[i].y2,1); 98 ans=max(ans,tree[1].sum); 99 } 100 printf("%I64d\n",ans); 101 } 102 }
hdu Stars in Your Window(线段树,涉及扫描线建立)
原文:http://www.cnblogs.com/sdau--codeants/p/3530207.html