int n; const int maxn = 100010; int a[maxn]; int sum1[maxn]; int sum2[maxn]; inline int lowbit(int x) { return x & (-x); } inline void updata(int i, int k) { int x = i; while (i <= n) { sum1[i] += k; sum2[i] += k * (x - 1); i += lowbit(i); } } inline int get_sum(int i) { int res = 0; int x = i; while (i > 0) { res += x * sum1[i] - sum2[i]; i -= lowbit(i); } return res; } int main() { //输入n for (int i = 1; i <= n; i++) { //输入a[i] updata(i, a[i] - a[i - 1]); } int l, r, t; //输入l,r,t //[l,r]区间加t updata(l, t); updata(r + 1, t); //输入l,r int sum; //询问[l,r]区间和 sum = get_sum(r) - get_sum(l - 1); }
原文:https://www.cnblogs.com/thjkhdf12/p/11653634.html