題意:給你乙個高位h寬為w的木板,現在給你一些通知條高度為1,寬度為wi,現在要盡可能的將每乙個通知條往木板的最上層放,並盡量向當前層的左邊放(從最高層到最低層的按1---min(h,n)開始編號),對於每輸入的乙個紙條輸出其可以擺放的最高層次,若該紙條不能被放,那麼輸出-1
分析:由於h和w均為10^9,如果想暴力的話,不但會超時而且還會超記憶體,這裡我們可以往線段樹上去想,由於每個紙條能夠放在當前行的條件是當前行的剩餘的寬度要大於紙條的寬度,我們求的是每個紙條對應的行,那麼我們就可以用行來作為區間用來更新,查詢的時候盡可能的向著左子樹查詢,因為他的行號最小對應的層數最高
**:
#include#include#includeusing namespace std;
const int n = 222225;
int ans;
struct node
tree[n*4];
void bulid(int rt, int l, int r,int w)
void search(int rt,int x)
if(tree[2*rt].maxw>=x)
search(2*rt,x);
else if(tree[2*rt+1].maxw >=x)search(2*rt+1,x);
tree[rt].maxw = tree[2*rt].maxw>tree[2*rt+1].maxw ? tree[2*rt].maxw : tree[2*rt+1].maxw;
}
int main ()
{ int h, w, n,i,x;
while(scanf("%d%d%d",&h,&w,&n)!=eof)
{ if(h>n)h= n;//至多需要的行數
bulid(1,1,h,w);
for(i=0;i
hdu 2795 線段樹(縱向)
注意h的範圍和n的範圍,縱向建立線段樹 題意 h w的木板,放進一些1 l的物品,求每次放空間能容納且最上邊的位子 思路 每次找到最大值的位子,然後減去l 線段樹功能 query 區間求最大值的位子 直接把update的操作在query裡做了 3 5 524 3331 213 1 2015 05 1...
HDU2795(線段樹 單點更新 思維)
題目鏈結 題目大意 給乙個h高,w寬的廣告牌,以及n條廣告的寬度,每條廣告的高度預設為1,問n條廣告能插上的話所在的最高行數,插入不了輸入 1.解題思路 比較容易到用mlen維護區間h能夠裝下的最長廣告的長度 未插入 n在2e5內,所以線段樹最多就開8e5就足夠了!之後單點更新的時候順帶返回下標。c...
hdu 2795(線段樹的應用)
hdu 2795 1 思路 每個格仔的寬度都已經確定,所以一開始預設已知所有的格仔,建立線段樹,單點更新區間值 x位置的點,因為線段樹的結構類似二叉樹,所以可以將線段樹看做乙個類二叉樹,每次x先找左區間 先找下標小的區間 否則找右的區間,遞迴縮小區間,最終修改最接近x且最靠前的 點的值。2 注意 這...