蒟蒻询问此题怎么压缩空间。。。
查看原帖
蒟蒻询问此题怎么压缩空间。。。
397949
risingstar楼主2021/1/5 11:43
#include<stdio.h> 
int D,S,n;
int d,s,w,x,y;
struct T{
	int v;
	int ly;
};
struct T t[3501][3501];
struct T lx[3501][3501];
int max(int a,int b)
{
	return a>b?a:b;
}
void upy(struct T tt[3501][3501],int ox,int oy,int l,int r,int yl,int yr,int k)
{
	tt[ox][oy].v=max(tt[ox][oy].v,k);
	if(yl<=l&&r<=yr){
		tt[ox][oy].ly=max(tt[ox][oy].ly,k);
		return;
	}
	else{
		int mid=l+r>>1;
		if(yl<=mid)upy(tt,ox,oy<<1,l,mid,yl,yr,k);
		if(mid<yr)upy(tt,ox,oy<<1|1,mid+1,r,yl,yr,k);
	}
}
void upx(int ox,int l,int r,int xl,int xr,int yl,int yr,int k)
{
	upy(t,ox,1,1,S,yl,yr,k);
	if(xl<=l&&r<=xr){
		upy(lx,ox,1,1,S,yl,yr,k);
		return ;
	}
	else{
		int mid=l+r>>1;
		if(xl<=mid)upx(ox<<1,l,mid,xl,xr,yl,yr,k);
		if(mid<xr)upx(ox<<1|1,mid+1,r,xl,xr,yl,yr,k);
	}
}
int quey(struct T tt[3501][3501],int ox,int oy,int l,int r,int yl,int yr)
{
	if(yl<=l&&r<=yr)return tt[ox][oy].v;
	else{
		int ans=tt[ox][oy].ly,mid=l+r>>1;
		if(yl<=mid)ans=max(ans,quey(tt,ox,oy<<1,l,mid,yl,yr));
		if(mid<yr)ans=max(ans,quey(tt,ox,oy<<1|1,mid+1,r,yl,yr));
		return ans;
	}
}
int quex(int ox,int l,int r,int xl,int xr,int yl,int yr)
{
	if(xl<=l&&r<=xr)return quey(t,ox,1,1,S,yl,yr);
	else{
		int ans=quey(lx,ox,1,1,S,yl,yr),mid=l+r>>1;
		if(xl<=mid)ans=max(ans,quex(ox<<1,l,mid,xl,xr,yl,yr));
		if(mid<xr)ans=max(ans,quex(ox<<1|1,mid+1,r,xl,xr,yl,yr));
		return ans;
	}
}
int main()
{
	scanf("%d%d%d",&D,&S,&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d%d",&d,&s,&w,&x,&y);
		int u=quex(1,1,D,x,x+d-1,y,y+s-1)+w;
		upx(1,1,D,x,x+d-1,y,y+s-1,u);
	}
	printf("%d",quex(1,1,D,1,D,1,S));
}
2021/1/5 11:43
加载中...