如题,代码如下,码风良好
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,t,q,m;
struct xds
{
int bj[4000],mx[4000];
void gc(int b,int l,int r,int x,int y,int z){
if(r<x||l>y)return;
mx[b]=max(mx[b],z);
if(x<=l&&r<=y){
bj[b]=max(bj[b],z);
return ;
}
int mid=(l+r)>>1;
gc(b<<1,l,mid,x,y,z),gc(b<<1|1,mid+1,r,x,y,z);
}
int cc(int b,int l,int r,int x,int y){
if(r<x||l>y)return 0;
int dx=0;
dx=max(bj[b],dx);
if(x<=l&&r<=y){
dx=max(dx,mx[b]);
return dx;
}
int mid=(l+r)>>1;
return max(max(cc(b<<1,l,mid,x,y),cc(b<<1|1,mid+1,r,x,y)),dx);
}
}bj[4000],mx[4000];
void gc(int b,int l,int r,int x,int y,int x1,int y1,int z){
if(r<x||l>y)return;
mx[b].gc(1,1,m,x1,y1,z);
if(x<=l&&r<=y){
bj[b].gc(1,1,m,x1,y1,z);
return ;
}
int mid=(l+r)>>1;
gc(b<<1,l,mid,x,y,x1,y1,z),gc(b<<1|1,mid+1,r,x,y,x1,y1,z);
}
int cc(int b,int l,int r,int x,int y,int x1,int y1){
if(r<x||l>y)return 0;
int dx=0;
dx=max(bj[b].cc(1,1,m,x1,y1),dx);
if(x<=l&&r<=y){
dx=max(dx,mx[b].cc(1,1,m,x1,y1));
return dx;
}
int mid=(l+r)>>1;
return max(max(cc(b<<1,l,mid,x,y,x1,y1),cc(b<<1|1,mid+1,r,x,y,x1,y1)),dx);
}
int main(){
int aa,x,y,d,s;
scanf("%d%d%d",&n,&m,&q);
while(q--){
scanf("%d%d%d%d%d",&d,&s,&aa,&x,&y);
x++,y++,d--,s--;
gc(1,1,n,x,x+d,y,y+s,cc(1,1,n,x,x+d,y,y+s)+aa);
}
printf("%d",mx[1].mx[1]);
return 0;
}