社区讨论
萌新刚学线段树就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 条回复,欢迎继续交流。
正在加载回复...