二维线段树板子,注意标记永久化。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int ans,A,B,n,ql,qr,qd,qu; 4 struct Querx 5 { 6 int v[3005],tag[3005]; 7 void change(int k,int l,int r,int L,int R,int w) 8 { 9 v[k]=max(v[k],w); 10 if(l==L&&r==R){tag[k]=max(tag[k],w);return;} 11 int m=l+r>>1; 12 if(R<=m)change(k<<1,l,m,L,R,w); 13 else if(L>m)change(k<<1|1,m+1,r,L,R,w); 14 else change(k<<1,l,m,L,m,w),change(k<<1|1,m+1,r,m+1,R,w); 15 } 16 int query(int k,int l,int r,int L,int R) 17 { 18 if(l==L&&r==R){return v[k];} 19 int m=l+r>>1;int tmp=tag[k]; 20 if(R<=m)return max(tmp,query(k<<1,l,m,L,R)); 21 else if(L>m)return max(tmp,query(k<<1|1,m+1,r,L,R)); 22 else return max(tmp,max(query(k<<1,l,m,L,m),query(k<<1|1,m+1,r,m+1,R))); 23 } 24 }; 25 struct Query 26 { 27 Querx v[3005],tag[3005]; 28 void change(int k,int l,int r,int L,int R,int w) 29 { 30 v[k].change(1,1,B,qd,qu,w); 31 if(l==L&&r==R){tag[k].change(1,1,B,qd,qu,w);return;} 32 int m=l+r>>1; 33 if(R<=m)change(k<<1,l,m,L,R,w); 34 else if(L>m)change(k<<1|1,m+1,r,L,R,w); 35 else change(k<<1,l,m,L,m,w),change(k<<1|1,m+1,r,m+1,R,w); 36 } 37 int query(int k,int l,int r,int L,int R) 38 { 39 if(l==L&&r==R){return v[k].query(1,1,B,qd,qu);} 40 int m=l+r>>1;int tmp=tag[k].query(1,1,B,qd,qu); 41 if(R<=m)return max(tmp,query(k<<1,l,m,L,R)); 42 else if(L>m)return max(tmp,query(k<<1|1,m+1,r,L,R)); 43 else return max(tmp,max(query(k<<1,l,m,L,m),query(k<<1|1,m+1,r,m+1,R))); 44 } 45 }P; 46 int main() 47 { 48 scanf("%d%d%d",&A,&B,&n); 49 for(int i=1;i<=n;++i) 50 { 51 int x,y,z,h,a,b; 52 scanf("%d%d%d%d%d",&x,&y,&z,&a,&b); 53 ql=a+1;qr=a+x;qd=b+1;qu=b+y; 54 ans=P.query(1,1,A,ql,qr); 55 P.change(1,1,A,ql,qr,ans+z); 56 } 57 qd=1;qu=B;ans=P.query(1,1,B,1,B); 58 printf("%d\n",ans); 59 return 0; 60 }