1. 程式人生 > >洛谷 P3437 [POI2006]TET-Tetris 3D

洛谷 P3437 [POI2006]TET-Tetris 3D

string 永久 -- pri 所在 目標 兩個 錯誤 分號

二維線段樹區間更新啊

樹套樹的外層樹,如果是線段樹的話一般似乎不能打標記?(畢竟標記不好下傳)

然而起碼對於這題是可以的...對於外層線段樹,每個節點放兩個值dat和setv,分別是得到的值和修改操作留下的標記。

然後外層線段樹要標記永久化...標記永久化之後,標記的定義不一樣了。

這道題裏用dat[i]表示i節點表示的整段區間都達到的值,setv[i]表示i節點表示的區間的最大值

這樣進行修改操作的時候,更新所有經過的節點的setv(因為只要經過該點,那麽該點表示的區間和目標區間一定有相交部分),更新被目標區間完全包含的區間所在節點的dat(自然整段都達到那個值了)

進行查詢操作的時候,"所有經過節點的dat"和"所有被目標區間完全包含的區間所在節點的setv"的最大值就是答案。

二維都一樣,只不過外層線段樹的查詢是對於內層線段樹的給定區間查詢/修改

標記不下傳

(一眼看起來似乎不是很對?有些信息被遺漏了?然而的確是對的23333)

(似乎修改和查詢完全是對稱的...)

錯誤記錄:71行少了分號後的兩個語句導致WA一片

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define lc (num<<1)
 5 #define rc (num<<1|1)
 6 #define mid ((l+r)>>1)
 7
using namespace std; 8 int n,m; 9 namespace XXX 10 { 11 int L,R,x; 12 struct Y 13 { 14 int dat[2100],setv[2100]; 15 //dat表示整段區間都達到的值,setv表示區間最大值 16 void update(int l,int r,int num) 17 { 18 setv[num]=max(setv[num],x); 19 if(L<=l&&r<=R) 20 {
21 dat[num]=max(dat[num],x); 22 return; 23 } 24 if(L<=mid) update(l,mid,lc); 25 if(mid<R) update(mid+1,r,rc); 26 } 27 int query(int l,int r,int num) 28 { 29 if(L<=l&&r<=R) return setv[num]; 30 int ans=dat[num]; 31 if(L<=mid) ans=max(ans,query(l,mid,lc)); 32 if(mid<R) ans=max(ans,query(mid+1,r,rc)); 33 return ans; 34 } 35 }; 36 } 37 int L,R,x; 38 XXX::Y dat[2100],setv[2100]; 39 void update(int l,int r,int num) 40 { 41 XXX::x=x; 42 setv[num].update(1,m,1); 43 if(L<=l&&r<=R) 44 { 45 XXX::x=x; 46 dat[num].update(1,m,1); 47 return; 48 } 49 if(L<=mid) update(l,mid,lc); 50 if(mid<R) update(mid+1,r,rc); 51 } 52 int query(int l,int r,int num) 53 { 54 if(L<=l&&r<=R) return setv[num].query(1,m,1); 55 int ans=dat[num].query(1,m,1); 56 if(L<=mid) ans=max(ans,query(l,mid,lc)); 57 if(mid<R) ans=max(ans,query(mid+1,r,rc)); 58 return ans; 59 } 60 int main() 61 { 62 int Q,d,s,w,xx,yy; 63 scanf("%d%d%d",&n,&m,&Q); 64 while(Q--) 65 { 66 scanf("%d%d%d%d%d",&d,&s,&w,&xx,&yy);xx++;yy++; 67 L=xx;R=xx+d-1;XXX::L=yy;XXX::R=yy+s-1; 68 x=query(1,n,1)+w;//printf("%d\n",x); 69 update(1,n,1); 70 } 71 L=1;R=n;XXX::L=1;XXX::R=m; 72 printf("%d",query(1,n,1)); 73 return 0; 74 }

洛谷 P3437 [POI2006]TET-Tetris 3D