線段樹及其基本操作

2022-03-24 09:13:52 字數 1581 閱讀 5327

處理何種問題:陣列單點更新,單點查詢,區間更新,區間求和,區間求最值。

效能:時間複雜度為o(logn)

原理:區間跟新的懶惰標記了解一下,其餘略

實現步驟:略

線段樹的區間求最值差別不大,在此貼乙份a過題的最值**,用來對比找bug。

#include#include#include#includeusing namespace std;

const int maxn=200010;

struct node

;node tree[maxn*4];

int num[maxn];

int n,ctor,x,ans,a,b,y;

void built(int k,int ll,int rr)

else

} void change_point(int k)

else

}void ask_interval(int k)

else

} int main()

else if(c=='u')//單點更新}}

return 0;

}

輸入樣例解釋

9//n個元素

1 2 3 4 5 6 7 8 9

1 5//單點查詢為1,x為座標,從1開始計數

2 5 0//單點修改為2,x為座標,y為更新值,

3 1 5//區間查詢為3,查詢[a,b]區間內的元素和,

4 1 5 10//區間更新為4,將[a,b]區間內的元素均加y

輸出樣例解釋

5 //對於1的操作

10//對於3的操作輸出

#include#include#include#includeusing namespace std;

const int maxn=100010;

struct node

;node tree[maxn*4];

int num[maxn];//原序列

int n,ctor,x,ans,a,b,y;//元素個數,建樹是計數變數,單點查詢時位置,左區間,右區間,區間修改值

void built(int k,int ll,int rr)//建樹

else

}void down(int k)//懶惰標記

void ask_point(int k)//單點查詢

else

}void change_point(int k)//單點更新

else

}void ask_interval(int k)//區間查詢

else

}void change_interval(int k)//區間更新

else

}int main()

else if(q==2)//單點更新

else if(q==3)//區間查詢

else if(q==4)//區間更新}}

return 0;

}

線段樹基本操作(1)

建樹,查詢和單點修改 把一段長度為2 k的區間逐次對半分,可以總共分成2 k 1 1各節點,變成了一棵二叉樹 對於區間 lt,rt 它的子節點為區間 lt,mid 和區間 mid 1,rt 查詢時只要要查詢的區間的左右邊界剛好等於已知區間的邊界,就可以返回值了,不需要一搜到底 對於單點修改,基本上和...

線段樹基本操作(2)

假如指定乙個操作給一段區間的所有值加2,求任意區間的最小值 更新 才發現在change是就更改結點值而查詢時只釋放結點會更快,下面摘自網上 對於任意區間的修改,我們先按照查詢的方式將其劃分成線段樹中的結點,然後修改這些結點的資訊,並給這些結點標上代表這種修改操作的標記。在修改和查詢的時候,如果我們到...

線段樹的基本操作

點更新 1 include 點更新2 include 3 include 4 5using namespace std 67 const int n 10000 8 intn,m,a n 9struct node 10tree 4 n 1415 void build int id,int l,int...