題目大意:在h*w 高乘寬這樣大小的 board上要貼廣告,每個廣告的高均為1,wi值就是資料另給,每組陣列給了乙個board和多個廣告,要你求出,每個廣告應該貼在board的哪一行,如果實在貼不上,就輸出-1;
這個題目也難以想到居然是用線段樹來做
我們需要考慮的是,線段樹究竟表示的是什麼資料。在這個題目裡,由於每個廣告的高都為1,是不是好像感覺每一行都是乙個葉子節點一樣。沒錯,就是這樣。。。化抽象為具體一點,那就是把這個board給豎起來,這樣最底部的孩子存貯了當前行的空閒寬度,每個父節點都是左右孩子的max。
其實思路這樣理一下,感覺其實很簡單,是把。
還要注意的一點是,雖然題目說h 和 w高達10的九次方,但並不意味著我線段樹要建如此大(事實上真要建也建不了),由於廣告最多只有200000個,所以,你想,底層葉子最多,也就每個廣告佔一行,那也就是這麼大。。。因此線段樹的大小真心不能只看表面
#include #include#include
#define lson (x<<1),l,mid
#define rson (x<<1|1),mid+1,r
#define maxn 200005
using
namespace
std;
int d[maxn*4
];int max(int a,int
b)void getup(int
x)void build (int wid,int x,int l,int
r)
int mid=(l+r)/2
; build(wid,lson);
build(wid,rson);
getup(x);}/*
void update(int a,int x,int l,int r)
int mid=(l+r)/2;
if (a<=d[x<<1]) update(a,lson);
else update(a,rson);
getup(x);}*/
int query(int a,int x,int l,int
r) }
int mid=(l+r)/2
;
int ret=0
;
if (a<=d[x<<1]) ret=query(a,lson);
else ret=query(a,rson);
if (ret>0
) getup(x);//及時更新父節點
return
ret;
}int
main()
}return0;
}
線段樹專題 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...