bzoj 1513: [POI2006]Tet-Tetris 3D 二维线段树

来源:互联网 发布:淘宝发布宝贝被限制 编辑:程序博客网 时间:2024/06/01 09:35

→题目链接←


【想说的话】

...........感冒了好难受


【题解】

二维线段树+标记永久化


【代码】

#include<bits/stdc++.h>#define MAXN 3030#define ls x<<1,lx,mid#define rs x<<1|1,mid+1,rxusing namespace std;inline int rd(){int x=0,y=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*y;}int n,m,q;int ll,rr;struct treex{int Max[MAXN],lazy[MAXN];void update(int x,int lx,int rx,int l,int r,int k){Max[x]=max(Max[x],k);if(lx>=l && rx<=r)lazy[x]=max(lazy[x],k);else{int mid=(lx+rx)/2;if(r<=mid)update(ls,l,r,k);else if(l>mid)update(rs,l,r,k);else update(ls,l,mid,k),update(rs,mid+1,r,k);}}int query(int x,int lx,int rx,int l,int r){if(lx>=l && rx<=r)return Max[x];int mid=(lx+rx)/2,ans=lazy[x];if(r<=mid)ans=max(ans,query(ls,l,r));else if(l>mid)ans=max(ans,query(rs,l,r));else ans=max(ans,max(query(ls,l,mid),query(rs,mid+1,r)));return ans;}};struct treey{treex Max[MAXN],lazy[MAXN];void update(int x,int lx,int rx,int l,int r,int k){Max[x].update(1,1,n,ll,rr,k);if(lx>=l && rx<=r)lazy[x].update(1,1,n,ll,rr,k);else{int mid=(lx+rx)/2;if(r<=mid)update(ls,l,r,k);else if(l>mid)update(rs,l,r,k);else update(ls,l,mid,k),update(rs,mid+1,r,k);}}int query(int x,int lx,int rx,int l,int r){if(lx>=l && rx<=r)return Max[x].query(1,1,n,ll,rr);int mid=(lx+rx)/2,ans=lazy[x].query(1,1,n,ll,rr);if(r<=mid)ans=max(ans,query(ls,l,r));else if(l>mid)ans=max(ans,query(rs,l,r));else ans=max(ans,max(query(ls,l,mid),query(rs,mid+1,r)));return ans;}}tree;int main(){n=rd(),m=rd(),q=rd();while(q--){int d=rd(),s=rd(),w=rd(),x=rd(),y=rd();ll=x+1,rr=x+d;int h=tree.query(1,1,m,y+1,y+s)+w;tree.update(1,1,m,y+1,y+s,h);}ll=1,rr=n;printf("%d\n",tree.query(1,1,m,1,m));return 0;}