題目大意:有一塊k*w的廣告牌,尋找1*l的廣告的最大貼上位置。
演算法思想:
主要使用線段樹的,查詢和更新操作。初始時建立乙個有h個葉子節點的線段樹,每個節點的之都為w,然後進行查詢操做,查詢每個廣告的寬度是否滿足max[1],不滿足是輸出-1,滿足時是輸出最優行號,每次查詢是伴隨著要對線段樹進行動態更新。下面的**中將查詢操作和更新操作寫在一起了。
**如下:
#include #include #include using namespace std;
const int maxn=222222;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int max[maxn<<2];
int h,w,n;
void pushup(int rt)
void build(int l,int r,int rt)
int query(int x,int l,int r,int rt)
int m=(l+r)>>1;
int ret=(max[rt<<1]>=x)? query(x,lson):query(x,rson);//尋找最大的查詢結果
pushup(rt);//更新線段樹
return ret;
}int main(){
while(cin>>h>>w>>n){
if(h>n) h=n;//此步為了減少線段樹的開銷
build(1,h,1);
while(n--){
int x;
cin>>x;
if(max[1]
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...