hdu 2795 線段樹(縱向)

2022-06-03 16:42:12 字數 1864 閱讀 8287

注意h的範圍和n的範圍,縱向建立線段樹

題意:h*w的木板,放進一些1*l的物品,求每次放空間能容納且最上邊的位子

思路:每次找到最大值的位子,然後減去l

線段樹功能:query:區間求最大值的位子(直接把update的操作在query裡做了)

3 5 524

3331

213-1

2015-05-15

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9#define mod 1000000007

10const

int inf=0x3f3f3f3f;11

const

double eps=1e-5;12

#define cl(a) memset(a,0,sizeof(a))

13#define ts printf("*****\n");

14#define lson l,mid,rt<<1

15#define rson mid+1,r,rt<<1|1

16#define root 1,n,1

17#define mid ((l+r)>>1)

18const

int maxn=200050;19

intn,m,t;

20int

num[maxn],w,h;

21struct

node

22node[maxn<<2

];26

void build(int l,int r,int

rt)27

35int query(int val,int

rt)36

42int ret=0;43

if(node[rt<<1].sum>=val) ret=query(val,rt<<1

);44

else ret=query(val,rt<<1|1

);45 node[rt].sum=max(node[rt<<1|1].sum,node[rt<<1

].sum);

46return

ret;47}

48int

main()

4965

}66 }

1 #include2 #include3 #include4 #include5 #include6 #include7

#define lson l,m,rt<<1

8#define rson m+1,r,rt<<1|1

9using

namespace

std;

10const

int maxn=222225;11

int sum[maxn<<2

];12

intn,m,t,h,w;

13void pushup(int

rt)14

17void build(int l,int r,int

rt)18

25int query(int add,int l,int r,int

rt)26

32int m=(l+r)>>1;33

intret;

34if(sum[rt<<1]>=add)

3538

else ret=query(add,rson);

39pushup(rt);

40return

ret;41}

42int

main()

4356}57

return0;

58 }

hdu 2795(線段樹的應用)

hdu 2795 1 思路 每個格仔的寬度都已經確定,所以一開始預設已知所有的格仔,建立線段樹,單點更新區間值 x位置的點,因為線段樹的結構類似二叉樹,所以可以將線段樹看做乙個類二叉樹,每次x先找左區間 先找下標小的區間 否則找右的區間,遞迴縮小區間,最終修改最接近x且最靠前的 點的值。2 注意 這...

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...