树状数组(区间修改,区间查询 )

Posted 1129-tangqiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组(区间修改,区间查询 )相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>
 2 #include<cstdio> 
 3 using namespace std;
 4 
 5 long long n,m;
 6 long long a[500009]; 
 7 long long c[500009],d[500009];
 8 long long lowbit(long long x)
 9 
10     return (x&(-x));
11 
12 void change(long long *e,long long x,long long k)
13 
14     for(int i=x;i<=n;i+=lowbit(i))
15     
16         e[i]+=k;
17     
18 
19 long long query(long long *e,long long x)
20 
21     long long sum=0;
22     for(int i=x;i>=1;i-=lowbit(i))
23     
24         sum+=e[i];
25     
26     return sum;
27 
28 int main()
29 
30     cin>>n>>m;
31     for(int i=1;i<=n;i++)
32     
33         cin>>a[i];
34         change(c,i,a[i]-a[i-1]);
35         change(d,i,(long long)(i-1)*(a[i]-a[i-1]));
36     
37     for(int i=1;i<=n;i++)
38     
39         cout<<c[i]<<" ";
40     
41     cout<<endl;
42     for(int i=1;i<=n;i++)
43     
44         cout<<d[i]<<" ";
45     
46     for(int i=1;i<=m;i++)
47     
48         long long p;
49         cin>>p;
50         if(p==1)//修改 
51         
52             long long r,l,v;
53             cin>>r>>l>>v;
54             change(c,r,v);
55             change(c,l+1,-v);
56             change(d,r,(long long)(r-1)*v);
57             change(d,l+1,(long long)-l*v);
58         
59         if(p==2)//统计 
60         
61             long long r,l;
62             cin>>r>>l;
63             long long t1=query(c,r-1)*(r-1)-query(d,r-1);
64             long long t2=query(c,l)*l-query(d,l);
65             printf("%lld\n",t2-t1);
66         
67     
68     return 0;
69 
70 /*
71 5 2
72 1 7 6 5 8
73 1 2 3 1//修改【2~3】+1 
74 2 2 4//查询2~4 
75 */

 

以上是关于树状数组(区间修改,区间查询 )的主要内容,如果未能解决你的问题,请参考以下文章

树状数组实现区间修改+区间查询

树状数组区间修改,区间更新:差分数组的运用

树状数组

树状数组从入门到弃疗

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

树状数组模板(持续更新)