線段樹補題

2021-09-25 09:41:49 字數 2778 閱讀 6269

最近打了幾場,比賽有幾個題都可以用線段樹解,雖然還有其他o(n)的解法比線段樹的o(nlogn)更優,**量也更少,但需要巧妙的構思或者其他技巧,可是我不會,我也想不出來。。。。但是如果用線段樹有些題裡面的o(n)的操作,直接變成o(logn)就行了。

#include

typedef

long

long ll;

using namespace std;

const

int n=

2e6+

100;

ll tree[

4*n]

,sum[n]

;//為sum數組建線段樹

void

build

(int o,

int l,

int r)

int mid=l+

(r-l)/2

;build

(o*2

,l,mid)

;build

(o*2+1

,mid+

1,r)

; tree[o]

=max

(tree[o*2]

,tree[o*2+

1]);

}int

query

(int o,

int l,

int r,ll v)

intmain()

build(1

,1,n);

int res=0;

for(

int i=

0;i<=n;i++

) cout<}

#include

#define ll long long

using namespace std;

const

int maxn =

1e5+

10, mod =

1e9+7;

ll tree[maxn *4]

, sum[maxn]

;int opt[maxn]

, l[maxn]

, r[maxn]

;void

add(ll &x, ll y)

ll qu

(int o,

int l,

int r,

int k)

voidup(

int o,

int l,

int r,

int ql,

int qr, ll v)

int m =

(l + r)/2

, ls = o *

2, rs = o *2+

1;if(ql <= m)

up(ls, l, m, ql, qr, v);if

(qr > m)

up(rs, m +

1, r, ql, qr, v);}

intmain()

else

}for

(int i =

1; i <= n; i++

)}

當然這一題也可以用差分陣列做,先用差分陣列對操作二求一遍字尾和即可。

邊標記邊求和。

#include

#define ll long long

using namespace std;

const

int n=

100005

;int n,len,b[n]

,ans[n]

,tree[n*4]

;struct nodea[n]

;bool cmp

(node a,node b)

int l,r,x,v;

void

build

(int o,

int l,

int r)

int mid=l+

(r-l)/2

;if(x<=mid)

build

(o*2

,l,mid)

;else

build

(o*2+1

,mid+

1,r)

; tree[o]

=max

(tree[o*2]

,tree[o*2+

1]);

}int

query

(int o,

int l,

int r)

intmain()

//用b[i]陣列對a[i].y進行離散化;

sort

(b+1

,b+1

+n);

int len=

unique

(b+1

,b+1

+n)-b-1;

for(

int i=

1;i<=n;i++

) a[i]

.y=lower_bound

(b+1

,b+len+

1,a[i]

.y)-b;

sort

(a+1

,a+1

+n,cmp)

;for

(int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++

)printf

("%d\n"

,ans[i]);

}

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...

線段樹 01 線段樹基礎

物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...

線段樹和zkw線段樹

好啦,我們就開始說說線段樹吧 線段樹是個支援區間操作和查詢的東東,平時的話還是蠻實用的 下面以最基本的區間加以及查詢區間和為例 線段樹顧名思義就是棵樹嘛,葉子節點是每個基本點,它們所對應的父親就是它們的和,具體如下圖 但是對於這樣的線段樹來說,操作所需的時間是遠達不到我們的要求的 會被t 因為我們會...