社区讨论

萌新刚学线段树就MLE求助

P3437[POI 2006] TET-Tetris 3D参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@loc1c44d
此快照首次捕获于
2023/10/30 06:21
2 年前
此快照最后确认于
2023/11/04 11:55
2 年前
查看原帖
RT,MLE飞,56pts
蒟蒻求助
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 2050
#define ls (x<<1)
#define rs (x<<1|1)
int D,S,N;
struct Tree{
	int s[maxn*3],tag[maxn*3];
	void Add(int L,int R,int val,int l,int r,int x)
	{ 
		s[x]=max(val,s[x]);
		if(l==L&&R==r)
		{
			tag[x]=max(tag[x],val);
			return;
		}
		int mid=(l+r)>>1;
		if(R<=mid)Add(L,R,val,l,mid,ls);
		else
		{
			if(L>mid)Add(L,R,val,mid+1,r,rs);
			else Add(L,mid,val,l,mid,ls),Add(mid+1,R,val,mid+1,r,rs);
		}
	}
	int Query(int L,int R,int l,int r,int x)
	{
		if(L==l&&R==r)return s[x];
		int mid=(l+r)>>1;
		
		if(R<=mid) return max(Query(L,R,l,mid,ls),tag[x]);
		else
		{
			if(L>mid)return max(Query(L,R,mid+1,r,rs),tag[x]);
			else return max(tag[x],max(Query(L,mid,l,mid,ls),Query(mid+1,R,mid+1,r,rs)));
		}
	}
}s[maxn*3],tag[maxn*3];
void Add(int x1,int y1,int x2,int y2,int val,int l,int r,int x)
{
	s[x].Add(y1,y2,val,1,S,1);
	if(x1==l&&x2==r)
	{
		tag[x].Add(y1,y2,val,1,S,1);
		return;
	}
	int mid=(l+r)>>1;
	if(x2<=mid)Add(x1,y1,x2,y2,val,l,mid,ls);
    else{
        if(x1>mid)Add(x1,y1,x2,y2,val,mid+1,r,rs);
        else Add(x1,y1,mid,y2,val,l,mid,ls),Add(mid+1,y1,x2,y2,val,mid+1,r,rs);
	}
}
int Query(int x1,int y1,int x2,int y2,int l,int r,int x)
{
	if(x1==l&&x2==r)return s[x].Query(y1,y2,1,S,1);
	int mid=(l+r)>>1;
	int p=tag[x].Query(y1,y2,1,S,1);
	if(x2<=mid)return max(p,Query(x1,y1,x2,y2,l,mid,ls));
	else
	{
		if(x1>mid)return max(p,Query(x1,y1,x2,y2,mid+1,r,rs));
		else return max(p,max(Query(x1,y1,mid,y2,l,mid,ls),Query(mid+1,y1,x2,y2,mid+1,r,rs)));
	}
}
int main()
{
	scanf("%d%d%d",&D,&S,&N);
	D++,S++;
	while(N--)
	{
		int d,s,w,x,y;
		scanf("%d%d%d%d%d",&d,&s,&w,&x,&y);
		x++,y++;
		Add(x,y,x+d-1,y+s-1,Query(x,y,x+d-1,y+s-1,1,D,1)+w,1,D,1);
	}
	printf("%d\n",Query(1,1,D,S,1,D,1));
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...