線段樹專題 HDU2795 Billboard

2021-07-04 11:23:01 字數 1144 閱讀 7137

題意:給一塊h*w廣告板,然後給n個1*wi的廣告條,廣告條放的順序是有限選擇向上的,再優先選擇左邊的,對於每塊廣告條,輸出它放的位置,如果放不下,輸出-1

分析:很簡單的單點更新max值的線段樹,思路很好想,以廣告板的每個高度建樹,更新點的時候優先選擇高度值小的點。

注意:比較容易出錯的是 ,要注意h的範圍啊1e9!!!,直接以這個高度建樹肯定爆啊,這裡注意到n是200000,也就是說高度最多建這麼多就夠了,因為上面的板都放不下了,下面肯定也用不到的。

**:

#include #include #include #include #include #include#pragma comment(linker,"/stack:1024000000,1024000000")

using namespace std;

const int maxn = 2e5+5;

int maxz[maxn*4];

int h,w,n;

void up(int rt)

void build(int l,int r,int rt)

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

build(l,mid,rt<<1);

build(mid+1,r,rt<<1|1);

maxz[rt]=w;

}bool update(int k,int l,int r,int rt)

else return 0;

}int mid=(l+r)>>1;

if(maxz[rt<<1]>=k) update(k,l,mid,rt<<1);

else if(maxz[rt<<1|1]>=k) update(k,mid+1,r,rt<<1|1);

else return 0;

up(rt);

return 1;

}int main()

}}

hdu 2795 線段樹(縱向)

注意h的範圍和n的範圍,縱向建立線段樹 題意 h w的木板,放進一些1 l的物品,求每次放空間能容納且最上邊的位子 思路 每次找到最大值的位子,然後減去l 線段樹功能 query 區間求最大值的位子 直接把update的操作在query裡做了 3 5 524 3331 213 1 2015 05 1...

hdu 2795 Billboard 線段樹點區

題目大意 廣告牆高從上到下為h,寬左到右為w,還有n張廣告牌 用單位高度,寬度為wi的廣告牌去覆蓋牆 輸出廣告牌放的高度 優先選擇最上面的,同一高度則放在最左邊 不放不下則輸出 1 解題思路 建立線段樹,區間表示每個高度的剩餘的寬度 最下層的結點 tree t left tree t right 儲...

hdu 2795 Billboard 線段樹基礎題

include include define maxn 200000 struct nodee maxn 4 int h,w,n void build int a,int b,int c int query int val,int c void update int a,int b,int c,in...