poj 2482 挑战 284

来源:互联网 发布:auxre 如何设计软件 编辑:程序博客网 时间:2024/05/16 17:41

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const int big=50000;
int max(int a,int b) {return a>b?a:b;};
int min(int a,int b) {return a<b?a:b;};
struct Ne{
int x,y,v;
}ne[10005];

int data[1<<28];

bool cmp(Ne a,Ne b)
{
return a.y<b.y;
}

void build(int k,int l,int r)
{
data[k]=0;
if(r-l==1)
return;
build(2*k+1,l,(l+r)>>1);
build(2*k+2,(l+r)>>1,r);
}

void update(int k)
{
while(k>0)
{
k=(k-1)/2;
data[k]=max(data[2*k+1],data[2*k+2]);
}
}

void add(int k,int a,int b,int l,int r,int v)
{
//cout<<"////3"<<endl;
if(r<=a||l>=b)
{
//printf("1\n");
return;
}
else if(l<=a&&b<=r)
{
data[k]+=v;
update(k);
//printf("2\n");
return;
}
else if(r>a&&l<b)
{
// printf("4\n");
add(2*k+1,a,(a+b)>>1,l,r,v);
add(2*k+2,(a+b)>>1,b,l,r,v);
}
}

int main()
{
int n,a,b,rr;
ne[0].y=0;
while(~scanf("%d %d %d",&n,&a,&b))
{
rr=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&ne[i].x,&ne[i].y,&ne[i].v);
rr=max(rr,ne[i].x);
}
sort(ne+1,ne+n+1,cmp);
build(0,0,rr+1);
int ans=0,l=0,r=0;
for(;;)
{
//cout<<"///1"<<endl;
while(ne[r].y-ne[l].y<b)
{
r++;
if(r>n)
break;
//cout<<"////2"<<endl;
int k=ne[r].x-a+1;
if(k<0) k=0;
//printf("%d %d\n",k,ne[r].x+a);
add(0,0,rr+1,k,ne[r].x+a,ne[r].v);
ans=max(data[0],ans);
//cout<<"///ans:"<<ans<<endl;
}
if(r>n) break;
add(0,1,rr+1,ne[l].x-a+1,ne[l].x+a,-ne[l].v);
l++;
}
printf("%d\n",ans);
}
return 0;
}



原创粉丝点击