标签:坐标轴 content for ret 开始 cst desc span 改变
zkw线段树套zkw线段树+标记永久化 维护区间最值
#include<cstdio> int n,D,S; int x1,y1,x2,y2,h,ans,a0=0; int tr[2][2111][2111][2]; char buf[2000000],*ptr=buf-1; int _(){ int x=0,c=*++ptr; while(c<48)c=*++ptr; while(c>47)x=x*10+c-48,c=*++ptr; return x; } inline void maxs(int&a,int b){if(a<b)a=b;} void g(int(*a)[2]){ int l=1023+y1,r=1025+y2,ld=0,rd=0; for(;l^r^1;l>>=1,r>>=1){ if(ld)maxs(ans,a[l][1]); if(rd)maxs(ans,a[r][1]); if(~l&1)ld=1,maxs(ans,a[l^1][0]); if(r&1)rd=1,maxs(ans,a[r^1][0]); } if(ld)maxs(ans,a[l][1]); if(rd)maxs(ans,a[r][1]); for(l>>=1;l;l>>=1)maxs(ans,a[l][1]); } void s(int(*a)[2]){ int l=1023+y1,r=1025+y2,ld=0,rd=0; for(;l^r^1;l>>=1,r>>=1){ if(ld)maxs(a[l][0],ans); if(rd)maxs(a[r][0],ans); if(~l&1)ld=1,maxs(a[l^1][0],ans),maxs(a[l^1][1],ans); if(r&1)rd=1,maxs(a[r^1][0],ans),maxs(a[r^1][1],ans); } if(ld)maxs(a[l][0],ans); if(rd)maxs(a[r][0],ans); for(l>>=1;l;l>>=1)maxs(a[l][0],ans); } void cal(){ ans=0; int l=1023+x1,r=1025+x2,ld=0,rd=0; for(;l^r^1;l>>=1,r>>=1){ if(ld)g(tr[1][l]); if(rd)g(tr[1][r]); if(~l&1)ld=1,g(tr[0][l^1]); if(r&1)rd=1,g(tr[0][r^1]); } if(ld)g(tr[1][l]); if(rd)g(tr[1][r]); for(l>>=1;l;l>>=1)g(tr[1][l]); ans+=h; maxs(a0,ans); l=1023+x1,r=1025+x2,ld=0,rd=0; for(;l^r^1;l>>=1,r>>=1){ if(ld)s(tr[0][l]); if(rd)s(tr[0][r]); if(~l&1)ld=1,s(tr[0][l^1]),s(tr[1][l^1]); if(r&1)rd=1,s(tr[0][r^1]),s(tr[1][r^1]); } if(ld)s(tr[0][l]); if(rd)s(tr[0][r]); for(l>>=1;l;l>>=1)s(tr[0][l]); } int main(){ fread(buf,1,sizeof(buf),stdin); D=_();S=_();n=_(); for(int i=0;i<n;++i){ x2=_();y2=_();h=_(); x1=_();y1=_(); x2+=x1;y2+=y1; ++x1;++y1; cal(); } printf("%d",a0); return 0; }
bzoj1513: [POI2006]Tet-Tetris 3D
标签:坐标轴 content for ret 开始 cst desc span 改变
原文地址:http://www.cnblogs.com/ccz181078/p/6215986.html