1. 程式人生 > >BZOJ1513[POI2006]Tet-Tetris 3D

BZOJ1513[POI2006]Tet-Tetris 3D

scan clu chang scanf bits can int poi2006 name

二維線段樹板子,註意標記永久化。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int ans,A,B,n,ql,qr,qd,qu;
 4 struct Querx
 5 {
 6     int v[3005],tag[3005];
 7     void change(int k,int l,int r,int L,int R,int w)
 8     {
 9         v[k]=max(v[k],w);
10         if(l==L&&r==R){tag[k]=max(tag[k],w);return
;} 11 int m=l+r>>1; 12 if(R<=m)change(k<<1,l,m,L,R,w); 13 else if(L>m)change(k<<1|1,m+1,r,L,R,w); 14 else change(k<<1,l,m,L,m,w),change(k<<1|1,m+1,r,m+1,R,w); 15 } 16 int query(int k,int l,int r,int L,int R) 17 {
18 if(l==L&&r==R){return v[k];} 19 int m=l+r>>1;int tmp=tag[k]; 20 if(R<=m)return max(tmp,query(k<<1,l,m,L,R)); 21 else if(L>m)return max(tmp,query(k<<1|1,m+1,r,L,R)); 22 else return max(tmp,max(query(k<<1,l,m,L,m),query(k<<1
|1,m+1,r,m+1,R))); 23 } 24 }; 25 struct Query 26 { 27 Querx v[3005],tag[3005]; 28 void change(int k,int l,int r,int L,int R,int w) 29 { 30 v[k].change(1,1,B,qd,qu,w); 31 if(l==L&&r==R){tag[k].change(1,1,B,qd,qu,w);return;} 32 int m=l+r>>1; 33 if(R<=m)change(k<<1,l,m,L,R,w); 34 else if(L>m)change(k<<1|1,m+1,r,L,R,w); 35 else change(k<<1,l,m,L,m,w),change(k<<1|1,m+1,r,m+1,R,w); 36 } 37 int query(int k,int l,int r,int L,int R) 38 { 39 if(l==L&&r==R){return v[k].query(1,1,B,qd,qu);} 40 int m=l+r>>1;int tmp=tag[k].query(1,1,B,qd,qu); 41 if(R<=m)return max(tmp,query(k<<1,l,m,L,R)); 42 else if(L>m)return max(tmp,query(k<<1|1,m+1,r,L,R)); 43 else return max(tmp,max(query(k<<1,l,m,L,m),query(k<<1|1,m+1,r,m+1,R))); 44 } 45 }P; 46 int main() 47 { 48 scanf("%d%d%d",&A,&B,&n); 49 for(int i=1;i<=n;++i) 50 { 51 int x,y,z,h,a,b; 52 scanf("%d%d%d%d%d",&x,&y,&z,&a,&b); 53 ql=a+1;qr=a+x;qd=b+1;qu=b+y; 54 ans=P.query(1,1,A,ql,qr); 55 P.change(1,1,A,ql,qr,ans+z); 56 } 57 qd=1;qu=B;ans=P.query(1,1,B,1,B); 58 printf("%d\n",ans); 59 return 0; 60 }

BZOJ1513[POI2006]Tet-Tetris 3D