区间修改+区间查询的树状数组

/* https://www.acwing.com/solution/content/44886/ 看acwing */ #include <bits/stdc++.h> #define CLOSE ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define endl "\n" typedef long long LL; const int N = 1e6 + 10, M = N, mod = 1e9 + 7; using namespace std; int n, q; LL t1[N], t2[N], a[N], b[N]; int lowbit(int x) {return x & -x;} void add(int x, LL c, LL t[]){ for(int i = x; i <= n; i += lowbit(i)){ t[i] += c; } } LL getsum(int x, LL t[]){ LL sum = 0; for(int i = x; i; i -= lowbit(i)){ sum += t[i]; } return sum; } LL query(int x){ return getsum(x, t1) * (x + 1) - getsum(x, t2); } int main() { CLOSE; cin >> n >> q; for(int i = 1; i <= n; i ++){ cin >> a[i]; } for(int i = 1; i <= n; i ++){ b[i] = a[i] - a[i - 1]; add(i, b[i], t1); add(i, b[i] * i, t2); } while(q --){ int op; cin >> op; if(op == 1){ int l, r; LL k; cin >> l >> r >> k; add(r + 1, -k, t1), add(l, k, t1);//改差分数组 add(r + 1, -k * (r + 1), t2), add(l, k * l, t2);//改i*差分数组 } else{ int l, r; cin >> l >> r; cout << query(r) - query(l - 1) << endl; } } return 0; }

__EOF__

本文作者可爱的卤蛋
本文链接https://www.cnblogs.com/acwhr/p/18001294.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   可爱的卤蛋  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示