日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj1513【POI2006】Tet-Tetris 3D

發布時間:2025/6/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1513【POI2006】Tet-Tetris 3D 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1513: [POI2006]Tet-Tetris 3D

Time Limit:?30 Sec??Memory Limit:?162 MB
Submit:?733??Solved:?245
[Submit][Status][Discuss]

Description

Task: Tetris 3D "Tetris" 游戲的作者決定做一個新的游戲, 一個三維的版本號, 在里面非常多立方體落在平面板,一個立方體開始落下直到碰上一個曾經落下的立方體或者落地即停止. 作者想改變一下游戲的目的使得它更大眾化,在新游戲中你將知道落下的立方體信息以及位置,你的任務就是回答全部立方體落下后最高的方塊的高度.全部的立方體在下落過程中都是垂直的而且不會旋轉.平板左下角坐標為原點,而且平行于坐標軸.?

Input

第一行給出三個整數 D, S and N ( 1<= N<= 20 000, 1<= D, S <=1 000), 分別表示平板的長和寬以及下落立方體的數目. 接下來N 行每行描寫敘述一個立方體. 每行包括5個整數: d, s, w, x and y (1<= d, 0 <=x, d + x<= D, 1 <=s, 0<= y, s + y<= S, 1<= w <=100 000), 分別表示立方體的長\寬\高以及落下的左下角坐標, 長和寬都是平行于平板坐標軸的,落下后立方體著地的四個角坐標分別為: (x, y), (x + d, y), (x, y + s) and (x + d, y + s).?

Output

一個整數表示全部立方體落下后最高的方塊的高度.

Sample Input

7 5 4
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2

Sample Output

6

HINT

Source




題目大意:給定一個二維矩陣。每次詢問一個矩形范圍內最大值max。并把矩形內全部數更新為max+p。

看到這道題非常easy想到二維線段樹,可是存在兩個問題:二維線段樹的標記下傳和信息上傳不easy實現。

那怎么解決呢?答案是用標記永久化。

我們用v和tag表示由子節點求出的最大值和全然覆蓋該區間的最大值。每次改動時把路徑上全部的v和底端的tag都改動,每次詢問將路徑上的全部tag和底端的v取最大值。




#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; }

轉載于:https://www.cnblogs.com/zsychanpin/p/6984294.html

總結

以上是生活随笔為你收集整理的bzoj1513【POI2006】Tet-Tetris 3D的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。