HDU2795(線段樹 單點更新 思維)

2021-09-22 16:48:39 字數 1047 閱讀 7136

題目鏈結

題目大意:給乙個h高,w寬的廣告牌,以及n條廣告的寬度,每條廣告的高度預設為1,問n條廣告能插上的話所在的最高行數,插入不了輸入-1.

解題思路:比較容易到用mlen維護區間h能夠裝下的最長廣告的長度(未插入),n在2e5內,所以線段樹最多就開8e5就足夠了!之後單點更新的時候順帶返回下標。

code:

#include

using

namespace std;

const

int maxn =

(int

)2e5+5

;struct node

;node btree[maxn <<2]

;int val[maxn]

;int w,h,n;

inline

void

pushup

(int idx)

void

bulid

(int l,

int r,

int idx)

int mid = l +

(r - l >>1)

;bulid

(l, mid, idx <<1)

;bulid

(mid +

1, r, idx <<1|

1);pushup

(idx);}

//單點更新 返回更新的位置

intupdate

(int num,

int idx)

int flag =-1

;if(btree[idx <<1]

.mlen >= num)

else

if(btree[idx <<1|

1].mlen >= num)

pushup

(idx)

;return flag;

}int

main()

}return0;

}

hdu 2795 單點更新

題意 有乙個公告欄,h m的,給定n個操作,對於每乙個操作給定乙個數wi,表示有乙個通知的大小是1 wi的,每次對於這種操作將這個通知放在盡可能上面盡可能左邊的位置中去。思路 有h行,將每一行初始為m,表示還有m個空位可以放,那麼運用一棵線段樹來記錄下,行之間的區間最大值,就是可以放下的最大值。對於...

hdu 2795 線段樹更新單個節點

題意 給你乙個高位h寬為w的木板,現在給你一些通知條高度為1,寬度為wi,現在要盡可能的將每乙個通知條往木板的最上層放,並盡量向當前層的左邊放 從最高層到最低層的按1 min h,n 開始編號 對於每輸入的乙個紙條輸出其可以擺放的最高層次,若該紙條不能被放,那麼輸出 1 分析 由於h和w均為10 9...

hdu 2795 線段樹(縱向)

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