昨天某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...