hdu 2795 找區間最值的位置

2021-06-09 15:31:01 字數 1444 閱讀 9132

題目很好理解

我只寫了兩種一種是update和query合併的線段樹是參考的。還有是分開的最開始寫的

本來想寫樹狀陣列的但是一下子真沒想到區間最值的更新位置怎麼弄就先緩緩吧。。希望有大牛可以指點

#include #include using namespace std;

#define lson l , m , rt << 1

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

const int maxn = 222222;

int h , w , n;

int max[maxn<<2];

void pushup(int rt)

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

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

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

(max[rt<<1] >= x) ? update(x , lson) : update(x , rson);

pushup(rt);

}int query(int x,int l,int r,int rt)

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

//如果該段(根節點判斷)可以存下x 那麼就在左子樹(本行) 反正就需要在下一行找

int ret = (max[rt<<1] >= x) ? query(x , lson) : query(x , rson);

//pushup(rt);

return ret;

}int main()

} }return 0;

}

合併的參考的網上的

#include #include using namespace std;

#define lson l , m , rt << 1

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

const int maxn = 222222;

int h , w , n;

int max[maxn<<2];

void pushup(int rt)

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

int query(int x,int l,int r,int rt)

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

//query在執行的同時將update的操作一併做了,這樣比較簡潔

int ret = (max[rt<<1] >= x) ? query(x , lson) : query(x , rson);

pushup(rt);

return ret;

}int main()

} return 0;

}

HDU 2795 單點更新 區間最值

hdu 2795 這題有點特殊,要在查詢的時候更新,而且 因為是找最小的行數,所以非左即右,優先考慮左 存在解情況下 ac code include include include include includeusing namespace std define debug 0 define in...

HDU2795 靈活的線段樹求區間最大值

這個題一開始有點傻,用的求和的線段樹,多了很多無用的查詢步驟,然後超時,然後優化了好久才想起來用區間最大值可以避免很多無用查詢層次,然後重寫。經過不斷的改寫,重寫,初步掌握線段樹的靈活飄逸的 風格。code include include include include include using ...

hdu 2795(線段樹的應用)

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