題目大意:有個公告板,大小為h*w,要貼n張公告,每個公告的長度是k,高度固定為1,公告放的要盡可能靠上並盡可能靠左,每給出一張公告,要求這個公告在滿足要求的情況下放在了第幾層。
題目思路:利用線段樹查詢的性質,複雜度只有logn。題目要求盡量靠左,那麼就採用tree陣列儲存每個區間的最大值,只要根節點左邊的點滿足就盡量取左邊,取完之後改變相應節點的值,(貪心的思想)。當取到區間長度為1的時候輸出答案,更新節點值。
學到的東西:當查詢的複雜度較高的時候,且涉及資料的維護與更新,那麼應該想到線段樹這種資料結構。
**:
#includeusing namespace std;
const int maxn=200000+5;
struct node
tree[maxn*4];
int h,w,n;//w-kuan
inline void build(int root,int l,int r)
inline void query(int root,int pos)
if(tree[root<<1].num>=pos) query(root<<1,pos);
else if(tree[(root<<1)+1].num>=pos) query((root<<1)+1,pos);
else printf("-1\n");
tree[root].num=max(tree[root<<1].num,tree[(root<<1)+1].num);//
}int main()
{ while(~scanf("%d%d%d",&h,&w,&n)){
build(1,1,min(h,maxn));
for(int i=0;i
線段樹專題 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...