245 你能回答這些問題嗎

2021-09-26 03:47:07 字數 1881 閱讀 4875

解題思路:

由於我們想要logn的時間複雜的情況下得到詢問的答案,並且還要進行修改,為了不超時所以想到了使用線段樹去求最大連續子串行和。

線段樹本身是用到了分治的思想,那麼如果用線段樹,我們需要用道哪些東西才能得到正確的答案呢?

因為是線段樹,所以我們每乙個序列都需要分成2個子序列。

那麼如果我們吧乙個序列直接分成2個子序列,如果我們得到了左邊子串行的最大值,也得到右邊子串行的最大值,那麼將子串行全部合起來的最大值就有3種情況:

1.左邊子串行的最大值。

2.右邊子串行的最大值。

3.中間某部分連線起來的數值

用線段樹的話,關鍵就是我們如何去維護一些資訊的道3這個答案;我們不妨這樣想,我們給線段樹種新增 lmax, rmax, maxx, sum;分別表示在這個區間內 從最左邊點開始序列的最大值, 從最右邊的點開始序列的最大值, 本序列的最大值, 整個區間之和。 假如我們得到了有這些資訊的左右子節點,那麼 1. max(左子樹的lmax, 左子樹的sum + 右子樹的lmax) 2. max(右子樹的rmax, 右子樹的sum + 左子樹的rmax) 3. max(左子樹的maxx, 右子樹的maxx, 左子樹的rmax + 右子樹的lmax)

ac**:

#include #include using namespace std;

const int maxn = 5e5 + 5;

struct segmenttree t[maxn * 4];

int a[maxn];

int n, m;

inline void build(int p, int l, int r)

int mid = (l + r) / 2;

build(p * 2, l, mid);

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

t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;

t[p].lmax = max(t[p * 2].lmax, t[p * 2].sum + t[p * 2 + 1].lmax);

t[p].rmax = max(t[p * 2 + 1].rmax, t[p * 2 + 1].sum + t[p * 2].rmax);

t[p].maxx = max(max(t[p * 2].maxx, t[p * 2 + 1].maxx), t[p * 2].rmax + t[p * 2 + 1].lmax);

}inline void change(int p, int x, int y)

int mid = (t[p].l + t[p].r) / 2;

if(x <= mid) change(p * 2, x, y);

else change(p * 2 + 1, x, y);

t[p].sum = t[p * 2].sum + t[p * 2 + 1].sum;

t[p].lmax = max(t[p * 2].lmax, t[p * 2].sum + t[p * 2 + 1].lmax);

t[p].rmax = max(t[p * 2 + 1].rmax, t[p * 2 + 1].sum + t[p * 2].rmax);

t[p].maxx = max(max(t[p * 2].maxx, t[p * 2 + 1].maxx), t[p * 2].rmax + t[p * 2 + 1].lmax);

}inline segmenttree ask(int p, int l, int r)

}int main(void)

else change(1, x, y); }

return 0;

}

總結:對於有關資料結構和圖論的題,如果遇到了困難,我個人覺得最好的理解方式就是暴力,即直接畫圖嘗試一番。

AcWing 245 你能回答這些問題嗎

線段樹單點修改 查詢最大子段和 一邊寫對?只不過忘了改陣列大小沒看到x yx y x y而已 維護區間和w ww,區間最大子段和f ff,從左端點開始的最大子段和lflf lf,從右端點開始的最大子段和rfrf rfw ww照樣維護,f ff取左兒子和右兒子的max maxma x,還要和左兒子的r...

你能回答這些問題嗎 線段樹

題目 給定長度為n的數列a,以及m條指令,每條指令可能是以下兩種之一 1 1 x y 查詢區間 x,y 中的最大連續子段和,即 2 2 x y 把 a x 改成 y。對於每個查詢指令,輸出乙個整數表示答案。輸入格式 第一行兩個整數n,m。第二行n個整數a i 接下來m行每行3個整數k,x,y,k 1...

面試,你回答過這些提問嗎?

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...