線段樹求區間最大值(單點修改)

2021-09-25 18:49:15 字數 1143 閱讀 6970

//問最大值

//q a b 詢問[a,b]中最大值

//c a b 將a點值改為b

#includeusing namespace std;

#pragma warning(disable:4996)

#define maxn 100005

#define ll long long

ll chushi[maxn], sum[maxn * 4];//記得開4倍空間

void pushup(int rt)

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

int mid = (l + r) / 2;//遞迴建樹——左子樹,右子樹

build(l, mid, 2 * rt);

build(mid + 1, r, 2 * rt + 1);

pushup(rt);//更新父親節點的值

}int qurry(int x, int y, int l, int r, int rt)

//pushdown(rt, r - l + 1);

int mid = (l + r) / 2;

int ret = 0;

int ret1 = 0;

//cout << l << " " << r << " " << mid << endl;

if (x <= mid) ret = max(ret, qurry(x, y, l, mid, 2 * rt));//如果這個區間的左兒子和目標區間有交集那麼搜尋左兒子

if (y > mid) ret1 = max(ret1, qurry(x, y, mid + 1, r, 2 * rt + 1));//如果這個區間的右兒子和目標區間有交集那麼搜尋右兒子

return max(ret1, ret);

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

int mid = (l + r) / 2;

if (x <= mid)update(x, c, l, mid, 2 * rt);

else update(x, c, mid + 1, r, 2 * rt + 1);

pushup(rt);

}int main()

}

線段樹 最大數 單點修改 求區間最大值

題目鏈結 題意 給定乙個正整數數列 a1,a2,an,每乙個數都在 0 p 1 之間。可以對這列數進行兩種操作 新增操作 向序列後新增乙個數,序列長度變成 n 1 詢問操作 詢問這個序列中最後 l 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案...

線段樹 區間修改 最大值

最大值 區間修改 總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 在n 1 n 100000 個數a1 an組成的序列上進行m 1 m 100000 次操作,操作有兩種 1 1 lr c 表示把a l 到a r 增加c c的絕對值不超過10000 2 ...

HDU1854 線段樹 單點修改區間最大值

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