hdu 2795 Billboard(單點更新)

2021-07-05 20:56:03 字數 1051 閱讀 5598

題目鏈結   hdu 2795 billbord

題目大意 :有一塊高度為h,寬度為w的廣告牌,現在有n張紙條,每次盡量要放在廣告牌的最左邊,最上方,紙條長度為wi,高度都為一,要你輸出每次貼在廣告牌上的位置

也就是第幾行,因為紙條高度為一,可以看成有h行;

解析: 可以建立乙個線段樹,每乙個葉子節點的區間邊界為行數(葉子節點左邊界等於右邊界),每個節點儲存的是此時每一行的容量,線段樹維護的是容量的最大值,每次

向上更新,區間儲存的都是左兒子和右兒子區間容量的最大值

一些細節 :不要看資料量那麼大,其實紙條只有n張,最多也就n行 

#include#include#include#define maxn 200005

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

using namespace std;

int max[maxn<<2];

void pushup(int rt)

void build(int w,int l,int r,int rt) //建樹

int query(int x,int l,int r,int rt) //詢問當前海報的位置

void update(int x,int l,int r,int rt)

int m=(l+r)>>1;

if(x<=max[rt<<1]) update(x,lson); //若x的長度小於左兒子的容量,往左邊更新

else update(x,rson); //否則往右邊更新

pushup(rt); //向上更新

}int main()

{ int h,w,n,x;

while(~scanf("%d%d%d",&h,&w,&n))

{if(h>n) h=n; //由於最多的海報是n,所以如果高度大於n,只需要在[1,n]建立線段樹,也是節點個數定為200005的原因

build(w,1,h,1); //建樹

while(n--)

{scanf("%d",&x);

if(max[1]

線段樹專題 HDU2795 Billboard

題意 給一塊h w廣告板,然後給n個1 wi的廣告條,廣告條放的順序是有限選擇向上的,再優先選擇左邊的,對於每塊廣告條,輸出它放的位置,如果放不下,輸出 1 分析 很簡單的單點更新max值的線段樹,思路很好想,以廣告板的每個高度建樹,更新點的時候優先選擇高度值小的點。注意 比較容易出錯的是 要注意h...

hdu 2795 單點更新

題意 有乙個公告欄,h m的,給定n個操作,對於每乙個操作給定乙個數wi,表示有乙個通知的大小是1 wi的,每次對於這種操作將這個通知放在盡可能上面盡可能左邊的位置中去。思路 有h行,將每一行初始為m,表示還有m個空位可以放,那麼運用一棵線段樹來記錄下,行之間的區間最大值,就是可以放下的最大值。對於...

hdu 2795 單點改動

題意 有h w大的公告板。有n條公告要寫入,每條公告高度都是1,寬度是wi,每次從最上最左的空位寫,假設有空位輸出第幾行。假設沒有足夠空位輸出 1。題解 注意h最大1e9。但事實上是看n的大小。由於假設有n條公告最多佔n行,所以線段樹最大是min h,n include include includ...