區間修改+區間求和 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國都掌握的一清二楚,每個工兵營地的人數都有可能發生...