hdu 2795(線段樹的應用)

2021-09-23 22:10:51 字數 772 閱讀 5826

hdu 2795

(1)思路:

每個格仔的寬度都已經確定,所以一開始預設已知所有的格仔,建立線段樹,

單點更新區間值》=x位置的點,因為線段樹的結構類似二叉樹,所以可以將線段樹看做乙個類二叉樹,

每次x先找左區間(先找下標小的區間),否則找右的區間,遞迴縮小區間,最終修改最接近x且最靠前的

點的值。

(2)注意:這裡的h很大,但是最多需要n個格仔,考慮最壞的情況,n個詢問都是w,

所以最多需要n層的w就好了,按照這個原理來縮小h值。

#include#include#includeusing namespace std;

const int maxn = 2e5+20;

int tree[maxn<<2],h,w,n;

int max(int x,int y)

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

void update(int x,int rt,int l,int r)

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

if(tree[rt<<1]>=x) update(x,rt<<1,l,mid);

else update(x,rt<<1|1,mid+1,r);

tree[rt] = max(tree[rt<<1],tree[rt<<1|1]);

}int main(void)

else printf("-1\n");

} }return 0;

}

hdu 2795 線段樹(縱向)

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

hdu 2795 線段樹更新單個節點

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

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

題目鏈結 題目大意 給乙個h高,w寬的廣告牌,以及n條廣告的寬度,每條廣告的高度預設為1,問n條廣告能插上的話所在的最高行數,插入不了輸入 1.解題思路 比較容易到用mlen維護區間h能夠裝下的最長廣告的長度 未插入 n在2e5內,所以線段樹最多就開8e5就足夠了!之後單點更新的時候順帶返回下標。c...