Or Fenwick Tree. Whatever.
必須要符合結合律的操作才可以喔!
struct BIT{
int n, val[N];
inline void init(int _n){
n = _n;
for(int i = 0; i <= n; ++i)
val[i] = 0;
}
inline void modify(int p, int v){
for(; p <= n; p += p & -p) val[p] += v;
}
inline int query(int p){
int ans = 0;
for(; p > 0; p -= p & -p) ans += val[p];
return ans;
}
} bit;
差分!
struct BIT{
int n, val[N];
inline void init(int _n, int v[]){
n = _n;
for(int i = 1; i <= n; ++i)
val[i] = 0;
for(int i = 1; i <= n; ++i){
val[i] += v[i];
if(i + (i & -i) <= n)
val[i + (i & -i)] += val[i];
}
}
} bit;
struct BIT{
int n, val[N];
inline int search(int v){
int sum = 0, p = 0;
for(int i = 31 - __builtin_clz(n); i > 0; --i)
if(p + (1 << i) <= n and sum + val[p + (1 << i)] < v)
p += 1 << i, sum += val[p];
return p + 1;
}
} bit;
給一長度為 \(n, n \leq 10^5\)的 32-bit 整數序列 \(S\),
求有多少對 \(i, j\) 使得 \(i < j, S_i > S_j\)
Hint:
離散化+值域 BIT
維護一個 multiset
支援兩種操作:
Hint:
值域 BIT +二分搜(或\(O(\log(n)\)搜)
維護一個 32-bit 整數集合 \( S \),
支援三種操作:
Hint:
先全部離散化
維護一個 \(n \cdot n, n \leq 1024\) 的棋盤,
支援兩種操作:
\(z\) 在 C++ short 範圍內。
Hint:
二為前綴和+二維BIT
給定一個長度為 \(n ( n \leq 50000) \) 的
序列 \(a ( \forall i, 1 \leq a_i \leq 10^5 ) \),
求有多少組 \((i, j, k)\),
\(s.t.\ i < j < k, a_i < a_j < a_k \cup a_i > a_j > a_k\)
Hint:
枚舉 \(j\),做兩次
給一棵有 \(n\ (n \leq 10^5) \)個節點的有根樹,
每個節點紀錄一個布林值,
支援兩種操作:
Hint:
樹壓平,區間修改,XOR
給一長度為 \( n \) 整數序列,
求有多少長度為 \(x (1 \leq x \leq k) \) 的
嚴格遞增子序列( LIS )
\( n \leq 10^5, k \leq 70 \)
Hint:
對 \(k\),值域做事
給一個一維或二維或三維的細格,
並在其中一些格子放玩具,
求有多少對玩具點對,
使得其曼哈頓距離 \(\leq D\)
Hint:
展開式子,曼哈頓轉切比雪夫