http://poj.org/problem?id=2482

(1)普通的线段树问题。

他人具体代码:

View Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
using namespace std;
const int mm=11111;
const int mn=mm<<2;
struct star
{
    int x,y,c;
}g[mm];
int dly[mn],sum[mn];
int y[mm],m;
void pushdown(int rt)
{
    sum[ls]+=dly[rt];
    sum[rs]+=dly[rt];
    dly[ls]+=dly[rt];
    dly[rs]+=dly[rt];
    dly[rt]=0;
}
void pushup(int rt)
{
    sum[rt]=max(sum[ls],sum[rs]);
}
void build()
{
    memset(dly,0,sizeof(dly));
    memset(sum,0,sizeof(sum));
}
void updata(int L,long long R,int val,int l,int r,int rt)
{
    if(L<=y[l]&&R>=y[r])
    {
        sum[rt]+=val;
        dly[rt]+=val;
        return;
    }
    if(dly[rt])pushdown(rt);
    int m=(l+r)>>1;
    if(L<=y[m])updata(L,R,val,lson);
    if(R>=y[m+1])updata(L,R,val,rson);
    pushup(rt);
}
bool cmp(star a,star b)
{
    return a.x<b.x;
}
int main()
{
    int i,j,k,n,w,h,ans;
    while(~scanf("%d%d%d",&n,&w,&h))
    {
        for(i=0;i<n;++i)
        {
            scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].c);
            y[i]=g[i].y;
        }
        sort(y,y+n);
        for(m=i=0;i<n;++i)
            if(y[m]!=y[i])y[++m]=y[i];
        sort(g,g+n,cmp);
        build();
        ans=0;
        for(j=i=0;i<n;++i)
        {
            updata(g[i].y,(long long)g[i].y+h-1,g[i].c,0,m,1);
            while(j<=i&&g[i].x-g[j].x+1>w)
            {
                updata(g[j].y,(long long)g[j].y+h-1,-g[j].c,0,m,1);
                ++j;
            }
            ans=max(ans,sum[1]);
        }
        printf("%d\n",ans);
    }
    return 0;
}