這個題一開始有點傻,用的求和的線段樹,多了很多無用的查詢步驟,然後超時,然後優化了好久才想起來用區間最大值可以避免很多無用查詢層次,然後重寫。
經過不斷的改寫,重寫,初步掌握線段樹的靈活飄逸的**風格。
code:
#include
#include
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const
int maxn=200100;
int sumtree[maxn<<2];
void pushup(int rt)
void build(int w,int l,int r,int rt)
int m=(l+r)/2;
build(w,lson);
build(w,rson);
pushup(rt);
}void updateandquery(int w,int l,int r,int rt)
int m=(l+r)/2;
if(w<=sumtree[rt<<1])
else
if(w<=sumtree[rt<<1|1])
pushup(rt);
//printf("sum[%d]=%d",rt,sumtree[rt]);
}int main()
}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(線段樹的應用)
hdu 2795 1 思路 每個格仔的寬度都已經確定,所以一開始預設已知所有的格仔,建立線段樹,單點更新區間值 x位置的點,因為線段樹的結構類似二叉樹,所以可以將線段樹看做乙個類二叉樹,每次x先找左區間 先找下標小的區間 否則找右的區間,遞迴縮小區間,最終修改最接近x且最靠前的 點的值。2 注意 這...
hdu 2795 線段樹更新單個節點
題意 給你乙個高位h寬為w的木板,現在給你一些通知條高度為1,寬度為wi,現在要盡可能的將每乙個通知條往木板的最上層放,並盡量向當前層的左邊放 從最高層到最低層的按1 min h,n 開始編號 對於每輸入的乙個紙條輸出其可以擺放的最高層次,若該紙條不能被放,那麼輸出 1 分析 由於h和w均為10 9...