标签:
题目大意:给定一个二维矩阵,每次询问一个矩形范围内最大值max,并把矩形内所有数更新为max+p。
看到这道题很容易想到二维线段树,但是存在两个问题:二维线段树的标记下传和信息上传不容易实现。
那怎么解决呢?答案是用标记永久化。
我们用v和tag表示由子节点求出的最大值和完全覆盖该区间的最大值。每次修改时把路径上所有的v和底端的tag都修改,每次询问将路径上的所有v和底端的tag取最大值。
#include<set> #include<map> #include<ctime> #include<queue> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int D,S,N; int ql,qr,qd,qu; struct segx { int v[3005],tag[3005]; void change(int k,int l,int r,int x,int y,int val) { v[k]=max(v[k],val); if(l==x&&y==r){tag[k]=max(tag[k],val);return;} int mid=(l+r)>>1; if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val); if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val); } int query(int k,int l,int r,int x,int y) { if(l==x&&y==r)return v[k]; int mid=(l+r)>>1,ans=tag[k]; if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y))); if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y)); return ans; } }; struct segy { segx v[3005],tag[3005]; void change(int k,int l,int r,int x,int y,int val) { v[k].change(1,1,S,qd,qu,val); if(l==x&&y==r){tag[k].change(1,1,S,qd,qu,val);return;} int mid=(l+r)>>1; if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val); if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val); } int query(int k,int l,int r,int x,int y) { if(l==x&&r==y)return v[k].query(1,1,S,qd,qu); int mid=(l+r)>>1,ans=tag[k].query(1,1,S,qd,qu); if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y))); if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y)); return ans; } }T; int main() { D=read();S=read();N=read(); int d,s,w,x,y; for(int i=1;i<=N;i++) { d=read();s=read();w=read();x=read();y=read(); ql=x+1;qr=x+d;qd=y+1;qu=y+s; int ans=T.query(1,1,D,ql,qr); T.change(1,1,D,ql,qr,ans+w); } qd=1;qu=S; printf("%d\n",T.query(1,1,D,1,D)); return 0; }
bzoj1513【POI2006】Tet-Tetris 3D
标签:
原文地址:http://blog.csdn.net/aarongzk/article/details/50538372