題意:給一塊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...