用于解决大部分区间离线问题的离线算法
主要思想是分块 时间复杂度O(n sqrt(n))
对于当前区间 [L,R] 1.加上当前区间左边一格的贡献,Add(--L) 2.加上当前区间右边一格的贡献 Add(++R) 3.减去当前区间最左一格的贡献 Sub(L++) 4.减去当前区间最右一格的贡献 Sub(R--)
分块 分成sqrt(n) 块
// Add Sub 函数根据具体题目写 int a[maxn]; int pos[maxn]; int ans[maxn]; struct Q { int l, r, k; friend bool operator < (const Q& a, const Q& b) { return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b, l]; } }q[maxn]; int res; int main() { int n, m; scanf("%d%d", &n, &m); int siz = sqrt(n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); pos[i] = i / siz; } for (int i = 0; i < m; i++) { scanf("%d %d", &q[i].l, &q[i].r); q[i].k = i; } sort(q, q + m); int l = 1, r = 0; for (int i = 0; i < m; i++) { while (q[i].l < l) Add(--l); while (q[i].r > r) Add(++r); while (q[i].l > l) Sub(l++); while (q[i].r < r) Sub(r--); ans[q[i].k] = res; } for (int i = 0; i < m; i++) { printf("%d\n", ans[i]); } return 0; }