ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二维树状数组模板(自用)

2022-05-22 21:31:36  阅读:234  来源: 互联网

标签:include 树状 LL add 自用 lld% maxa 模板 lld


demo:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<queue>
 6 #include<cstdio>
 7 #define LL long long 
 8 using namespace std;
 9 const int maxa=1024*2+10;//~~pow(2,11)+10
10 LL n,m;
11 LL C1[maxa][maxa],C2[maxa][maxa],C3[maxa][maxa],C4[maxa][maxa];//开辟四个树状数组用于维护 
12 LL lowbit(LL i){
13     return i&-i;
14 }
15 void add(LL a,LL b,LL k){
16     for(LL i=a;i<=n;i+=lowbit(i))
17         for(LL j=b;j<=m;j+=lowbit(j)){ 
18             C1[i][j]+=k;
19             C2[i][j]+=k*a;
20             C3[i][j]+=k*b;
21             C4[i][j]+=k*a*b;
22     } 
23 }
24 LL sum(LL x,LL y){
25     LL ans=0;
26     for(LL i=x;i>0;i-=lowbit(i))
27         for(LL j=y;j>0;j-=lowbit(j))
28             ans+=(x+1)*(y+1)*C1[i][j]-(y+1)*C2[i][j]-(x+1)*C3[i][j]+C4[i][j];
29     return ans;
30 }
31 int main(){
32     scanf("%lld%lld",&n,&m);
33     LL op,a,b,c,d,k; 
34     while(scanf("%lld",&op)!=EOF){
35         if(op==1){
36             scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
37             add(a,b,k);
38             add(c+1,d+1,k);
39             add(c+1,b,-k);
40             add(a,d+1,-k);
41             //一维差分数组应该为:add(x,k),add(y+1,-k); 
42         }
43         else if(op==2){
44             scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
45             printf("%lld\n",sum(c,d)-sum(a-1,d)-sum(c,b-1)+sum(a-1,b-1));//对于区间更新的查询 
46         }
47     }
48     return 0;
49 }

 

 

标签:include,树状,LL,add,自用,lld%,maxa,模板,lld
来源: https://www.cnblogs.com/wabi/p/16299096.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有