線段樹初見 區間詢問與改變最大值

2021-08-15 10:49:05 字數 3061 閱讀 5615

昨天某b組講主席樹,然後就作死的去聽了,也沒聽懂(因為連線段樹都不懂),然後好奇心就去問了一下老師線段樹是個蛤,然後這篇部落格就誕生了。

首先線段樹就是乙個可以快速區間改變和詢問的東東,實現方法就是用樹啦。具體方法看下面。

首先我們講一下例題:

一串串行,有2種操作

1.詢問乙個區間內的最大值

2.改變乙個數的值

這道題明顯沒有用到區間改值,那這裡先不扯區間改值:

以下線段樹草圖

每個點表示的是乙個區間內的樹

建樹**

int build(int l,int r,int k)

然後是查詢某區間

草圖

分成多份尋找需要的區間

查詢**

void find(int l,int r,int x,int y,int k)//表示在l~r之間需要x~y的最大值

int wz=(l+r)/2;//中心

if (y<=wz) find(l,wz,x,y,2*k);//需要全包涵在左邊

else

if (x>wz) find(wz+1,r,x,y,2*k+1);//需要全包涵在右邊

else

return;

}

然後由於這道題只需要改變單個數的,瞎水水就過了

**

#include

#include

using

namespace

std;

struct pointtree[400014];

int n,m,w,x,y,a[100007],ans;

int build(int l,int r,int k)//建數

void find(int l,int r,int x,int y,int k)//查詢

int wz=(l+r)/2;

if (y<=wz) find(l,wz,x,y,2*k);

else

if (x>wz) find(wz+1,r,x,y,2*k+1);

else

return;

}void updata(int l,int r,int x,int y,int k)//改變

//改變並返回

int wz=(l+r)/2;//確定位置

if (x<=wz) updata(l,wz,x,y,2*k);//在左邊

else

if (x>wz) updata(wz+1,r,x,y,2*k+1);//在右邊

tree[k].w=max(tree[2*k].w,tree[2*k+1].w);//更新值

}int main()

else

if (w==1)}}

依舊是乙個序列兩種操作

1.詢問乙個區間內的值

2.讓乙個區間內的值加上乙個數(可能是負數)

這裡就需要用到區間改變了

像查詢一樣,找到區間,如果直接改變整棵子樹會超時,所以先標記,查詢時在下傳

好了,區間改變**

void updata(int l,int r,int x,int y,int num,int k)

if (tree[k].lazy!=0)//順便下傳

int wz=(l+r)/2;//中心

if (y<=wz) updata(l,wz,x,y,num,2*k);

else

if (x>wz) updata(wz+1,r,x,y,num,2*k+1);

else

tree[k].w=max(tree[2*k].w,tree[2*k+1].w);//更新

}

**

#include

#include

using namespace std;

struct pointtree[400030];

long long ans;

int n,m,w,x,y,a[100007],num;

int build(int l,int r,int k)//建樹

void find(int l,int r,int

x,int

y,int k)//查詢

if (tree[k].lazy!=0)

int wz=(l+r)/2;

if (y

<=wz) find(l,wz,x,y,2

*k);

else

if (x>wz) find(wz+1,r,x,y,2

*k+1);

else

}void updata(int l,int r,int

x,int

y,int num,int k)//改值

if (tree[k].lazy!=0)

int wz=(l+r)/2;

if (y

<=wz) updata(l,wz,x,y,num,2

*k);

else

if (x>wz) updata(wz+1,r,x,y,num,2

*k+1);

else

tree[k].w=max(tree[2

*k].w,tree[2

*k+1].w);

}int main()

else

if (w==1)}}

hdu I hate it 區間最大值 線段樹

include define maxn 200001 define lson l,mid,rt 1 define rson mid 1,r,rt 1 1 int max maxn 2 int n,m int max int a,int b void pushup int rt 要理解好更新的定義,不...

線段樹 區間修改 最大值

最大值 區間修改 總時間限制 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 ...

數列區間最大值 線段樹

acwing 1270 time limit 2s memory limit 64mb problem description 輸入一串數字,給你 m 個詢問,每次詢問就給你兩個數字 x,y要求你說出 x 到 y 這段區間內的最大數。input output 輸出共 m 行,每行輸出乙個數。samp...