1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| int n=1000; struct seg { int val[MAXN],cov[MAXN]; void docov(int v,int cnt) { val[cnt]=max(val[cnt],v); cov[cnt]=max(cov[cnt],v); } void down(int cnt) { if(cov[cnt]) docov(cov[cnt],ls), docov(cov[cnt],rs), cov[cnt]=0; } bool update(int l,int r,int nl,int nr,int v,int cnt) { if(l==nl&&r==nr) return docov(v,cnt),0; down(cnt),val[cnt]=max(val[cnt],v); if(nr<=mid)return update(l,mid,nl,nr,v,ls); if(nl> mid)return update(mid+1,r,nl,nr,v,rs); return update(l,mid,nl,mid,v,ls),update(mid+1,r,mid+1,nr,v,rs); } int query(int l,int r,int nl,int nr,int cnt) { if(l==nl&&r==nr)return val[cnt];down(cnt); if(nr<=mid)return query(l,mid,nl,nr,ls); if(nl> mid)return query(mid+1,r,nl,nr,rs); return max(query(l,mid,nl,mid,ls),query(mid+1,r,mid+1,nr,rs)); } }val[MAXN],cov[MAXN]; int query(int l,int r,int nl,int nr,int y1,int y2,int cnt) { int ans=cov[cnt].query(1,n,y1,y2,1); if(l==nl&&r==nr)return max(ans,val[cnt].query(1,n,y1,y2,1)); if(nr<=mid)return max(ans,query(l,mid,nl,nr,y1,y2,ls)); if(nl> mid)return max(ans,query(mid+1,r,nl,nr,y1,y2,rs)); return max({ans, query(l,mid,nl,mid,y1,y2,ls), query(mid+1,r,mid+1,nr,y1,y2,rs) }); } bool update(int l,int r,int nl,int nr,int y1,int y2,int v,int cnt) { val[cnt].update(1,n,y1,y2,v,1); if(l==nl&&r==nr) return cov[cnt].update(1,n,y1,y2,v,1),0; if(nr<=mid)return update(l,mid,nl,nr,y1,y2,v,ls); if(nl> mid)return update(mid+1,r,nl,nr,y1,y2,v,rs); return update(l,mid,nl,mid,y1,y2,v,ls),update(mid+1,r,mid+1,nr,y1,y2,v,rs); } int work() { int a,b,q;scanf("%d%d%d",&a,&b,&q); while(q--) { int d,s,w,x,y; scanf("%d%d%d%d%d",&d,&s,&w,&x,&y); int x1=x+1,x2=x+d,y1=y+1,y2=y+s; int h=query(1,n,x1,x2,y1,y2,1)+w; update(1,n,x1,x2,y1,y2,h,1); } return printf("%d\n",query(1,n,1,n,1,n,1)); }
|