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; }
