單點更新 區間查詢最值 線段樹 杭電hdu1754

2021-08-03 16:07:26 字數 1475 閱讀 9697

單點更新 區間查詢最值 線段樹 杭電hdu1754

初學線段樹,覺得線段樹美在它的遞迴實現,可以更新,rmq演算法可以實現區間查詢最值,我不知道怎麼修改

#define _crt_secure_no_warnings

#include #include #include using namespace std;

const int n = 200007;

//線段樹的節點segtree[i]存根為i的線段樹的最值(用rmq演算法不能更新)

int segtree[n << 2];

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

int mid = l + r >> 1;

build(rt << 1, l, mid);

build(rt << 1 | 1, mid + 1, r);

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

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

void update(int rt, int l, int r, int pos, int val)

int mid = l + r >> 1;

if (pos <= mid)

update(rt << 1, l, mid, pos, val);

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

segtree[rt] = max(segtree[rt << 1], segtree[rt << 1 | 1]); //別忘了回溯

}int main()

} return 0;

}

附線段樹題 hdu 2795

#define _crt_secure_no_warnings

#include #include #include using namespace std;

const int n = 200007;

int h, w, n;

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

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

int mid = l + r >> 1, res;

if (segtree[rt << 1] >= x)

res = query(rt << 1, l, mid, x);

else res = query(rt << 1 | 1, mid + 1, r, x);

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

return res;

}int main()

} return 0;

}

杭電1754 線段樹(單點更新 區間最值)

杭電1754原題傳送門 線段樹單點更新詳解傳送門 寫在最前面 用scanf printf 代替cin cout 時間少的不是一點點。同樣的 scanf能過,cin超時。嗯,玄學做題。已過 include include include include using namespace std cons...

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...

I Hate It 線段樹單點更新區間查詢

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...