poj2482

来源:互联网 发布:ccs3.3是什么软件 编辑:程序博客网 时间:2024/04/29 07:41
#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<cmath>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MAX 30010using namespace std;class line{public:    long long x,y1,y2;    int flag;    line(){}    line(long long a ,long long b, long long c, int d):x(a),y1(b),y2(c),flag(d)    {}    bool operator <(const line b)const    {        if(x!=b.x)          return x<b.x;        return flag>b.flag;    }}lines[MAX*2];long long cy[MAX*2];struct node{    int l,r,cover,max;}a[MAX*3];void build(int t ,int l, int r){    a[t].l=l;    a[t].r=r;    a[t].cover=0;    a[t].max=0;    if(l==r)return;    int mid=(l+r)>>1;    build(L(t),l,mid);    build(R(t),mid+1,r);}void update(int t,line s){    if(s.y1<=cy[a[t].l]&&cy[a[t].r]<=s.y2)    {        a[t].cover+=s.flag;        a[t].max+=s.flag;        return;    }    if(a[t].l==a[t].r)return;    a[L(t)].cover+=a[t].cover;    a[L(t)].max+=a[t].cover;    a[R(t)].cover+=a[t].cover;    a[R(t)].max+=a[t].cover;    a[t].cover=0;    int mid=(a[t].l+a[t].r)>>1;    if(s.y1<=cy[mid])      update(L(t),s);    if(s.y2>cy[mid])      update(R(t),s);    a[t].max=max(a[L(t)].max,a[R(t)].max);}int main(){    int m,i,val;    long long w,h,x,y;    int numl,numy;    int ans;    while(scanf("%d%lld%lld",&m,&w,&h)!=EOF)    {    if(w==0||h==0)    {    printf("0\n");    continue;    }        numl=0;        numy=0;        ans=0;        while(m--)        {            scanf("%lld%lld%d",&x,&y,&val);            lines[numl++]=line(x,y,y+h-1,val);            lines[numl++]=line(x+w-1,y,y+h-1,-val);            cy[numy++]=y;            cy[numy++]=y+h-1;        }        sort(cy,cy+numy);        sort(lines,lines+numl);        numy=unique(cy,cy+numy)-cy;        build(1,0,numy-1);        for(i=0;i<numl;i++)        {            update(1,lines[i]);            ans=max(ans,a[1].max);        }        printf("%d\n",ans);    }}

原创粉丝点击