#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 30010
using 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);
}
}poj2482
最新推荐文章于 2018-07-21 09:30:41 发布
233

被折叠的 条评论
为什么被折叠?



