HDOJ 2795 線段樹(區域覆蓋問題)

2021-06-27 12:39:06 字數 824 閱讀 6883

題目大意:有一塊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...