線段樹 樹狀陣列 ST表 模板

2021-08-31 01:43:39 字數 1389 閱讀 7412

區間修改+區間求和 logn

const int n = 1e5 + 5;

int a[n];

namespace seg

c[n << 2];

void pushdown(int k, int l, int r)

void pushup(int k)

// l, r是總區間 left, right是查詢區間

long long query(int k, int l, int r, int left, int right)

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

int mid = (l + r) >> 1;

build(k << 1, l, mid);

build(k << 1 | 1, mid + 1, r);

pushup(k);

}// l, r是總區間 left, right是查詢區間,k是起始節點編號,val是更新的值

void update(int k, int l, int r, int left, int right, int val)

pushdown(k, l, r);

int mid = (l + r) >> 1;

if (left <= mid) update(k << 1, l, mid, left, right, val);

if (mid < right) update(k << 1 | 1, mid + 1, r, left, right, val);

pushup(k);

}}

區間求和+單點修改 logn

const int n = 1e5 + 5;

namespace bit

// 查詢[1, x]的區間和

inline long long sum(int x)

// 在x處加上val

inline void add(int x, long long val)

}

離線查詢區間最值 構造nlogn 查詢1

#include const int n = 500005;

int a[n];

inline int max(int x, int y)

inline int min(int x, int y)

namespace st

}// 構造st表

void init()

}// 查詢區間[l, r]的最大值

int querymax(int l, int r)

// 查詢區間[l, r]的最小值

int querymin(int l, int r)

}

線段樹,樹狀陣列 模板

線段樹 一 建樹 開始建樹的時候為built 1,1,n void built int rt int l,int r rt為結點,初始值為1,l,r分別為左右端點 二 單點查詢 void query int rt,int p 初始結點值為1 三 單點修改 void add int rt,int p,...

樹狀陣列和ST表

binary index tree 用來解決動態字首和問題的資料結構。樹狀陣列或者二叉索引樹也稱作binary indexed tree,又叫做fenwick樹 它的查詢和修改的時間複雜度都是log n 空間複雜度則為o n 這是因為樹狀陣列通過將線性結構轉化成樹狀結構,從而進行跳躍式掃瞄。通常使用...

A 敵兵布陣 樹狀陣列 線段樹模板

c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...