树状数组的各种变换

study from :

https://www.cnblogs.com/RabbitHu/p/BIT.html

loj

130

https://loj.ac/problem/130

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12 
13 #define ll long long
14 
15 const int maxn=1e6+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 
19 ll f[maxn];
20 int n;
21 
22 void modify(int i,int x)
23 {
24     while (i<=n)
25     {
26         f[i]+=x;
27         i+=i&-i;
28     }
29 }
30 
31 ll cal(int i)
32 {
33     ll sum=0;
34     while (i)
35     {
36         sum+=f[i];
37         i-=i&-i;
38     }
39     return sum;
40 }
41 
42 int main()
43 {
44     int q,x,y,z,i;
45     scanf("%d%d",&n,&q);
46     for (i=1;i<=n;i++)
47     {
48         scanf("%d",&x);
49         modify(i,x);
50     }
51 
52     while (q--)
53     {
54         scanf("%d%d%d",&x,&y,&z);
55         if (x==1)
56             modify(y,z);
57         else
58             printf("%lld\n",cal(z)-cal(y-1));
59     }
60     return 0;
61 }
62 /*
63 
64 */

131

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12 
13 #define ll long long
14 
15 const int maxn=1e6+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 
19 ll f[maxn];
20 int n;
21 
22 void modify(int i,int x)
23 {
24     while (i<=n)
25     {
26         f[i]+=x;
27         i+=i&-i;
28     }
29 }
30 
31 ll cal(int i)
32 {
33     ll sum=0;
34     while (i)
35     {
36         sum+=f[i];
37         i-=i&-i;
38     }
39     return sum;
40 }
41 
42 int main()
43 {
44     int q,x,y,z,r,i;
45     scanf("%d%d",&n,&q);
46     y=0;
47     for (i=1;i<=n;i++)
48     {
49         scanf("%d",&x);
50         modify(i,x-y);
51         y=x;
52     }
53 
54     while (q--)
55     {
56         scanf("%d%d",&x,&y);
57         if (x==1)
58         {
59             scanf("%d%d",&z,&r);
60             modify(y,r);
61             modify(z+1,-r);
62         }
63         else
64             printf("%lld\n",cal(y));
65     }
66     return 0;
67 }
68 /*
69 
70 */

132

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12 
13 #define ll long long
14 
15 const int maxn=1e6+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 
19 ll f1[maxn],f2[maxn];
20 int n;
21 
22 void modify(int i,int x)
23 {
24     ll xx=1ll*x*i;
25     while (i<=n)
26     {
27         f1[i]+=x;
28         f2[i]+=xx;
29         i+=i&-i;
30     }
31 }
32 
33 ll cal(int i)
34 {
35     int c=i+1;
36     ll sum=0;
37     while (i)
38     {
39         sum+=f1[i]*c-f2[i];
40         i-=i&-i;
41     }
42     return sum;
43 }
44 
45 int main()
46 {
47     int q,x,y,z,r,i;
48     scanf("%d%d",&n,&q);
49     y=0;
50     for (i=1;i<=n;i++)
51     {
52         scanf("%d",&x);
53         modify(i,x-y);
54         y=x;
55     }
56 
57     while (q--)
58     {
59         scanf("%d%d%d",&x,&y,&z);
60         if (x==1)
61         {
62             scanf("%d",&r);
63             modify(y,r);
64             modify(z+1,-r);
65         }
66         else
67             printf("%lld\n",cal(z)-cal(y-1));
68     }
69     return 0;
70 }
71 /*
72 
73 */

133

看数组就好。公式推导无法理解。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12 
13 #define ll long long
14 
15 const int maxn=1e6+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 
19 ll f[1<<12|1][1<<12|1];
20 int n,m;
21 
22 void modify(int i,int j,int x)
23 {
24     int ii=i;
25     while (j<=m)
26     {
27         i=ii;
28         while (i<=n)
29         {
30             f[i][j]+=x;
31             i+=i&-i;
32         }
33         j+=j&-j;
34     }
35 }
36 
37 ll cal(int i,int j)
38 {
39     int ii=i;
40     ll sum=0;
41     while (j)
42     {
43         i=ii;
44         while (i)
45         {
46             sum+=f[i][j];
47             i-=i&-i;
48         }
49         j-=j&-j;
50     }
51     return sum;
52 }
53 
54 int main()
55 {
56     int x,y,z,s,t;
57     scanf("%d%d",&n,&m);
58     while (~scanf("%d%d%d%d",&x,&y,&z,&s))
59     {
60         if (x==1)
61             modify(y,z,s);
62         else
63         {
64             scanf("%d",&t);
65             printf("%lld\n",cal(s,t)-cal(y-1,t)-cal(s,z-1)+cal(y-1,z-1));
66         }
67     }
68     return 0;
69 }
70 /*
71 
72 */

135

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12 
13 #define ll long long
14 
15 const int maxn=1e6+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 
19 ll f1[1<<12|1][1<<12|1],f2[1<<12|1][1<<12|1],f3[1<<12|1][1<<12|1],f4[1<<12|1][1<<12|1];
20 int n,m;
21 
22 void modify(int i,int j,int x)
23 {
24     int ii=i;
25     ll x2=1ll*x*i,x3=1ll*x*j,x4=1ll*x*i*j;
26     while (j<=m)
27     {
28         i=ii;
29         while (i<=n)
30         {
31             f1[i][j]+=x;
32             f2[i][j]+=x2;
33             f3[i][j]+=x3;
34             f4[i][j]+=x4;
35             i+=i&-i;
36         }
37         j+=j&-j;
38     }
39 }
40 
41 ll cal(int i,int j)
42 {
43     ll c1=1ll*(i+1)*(j+1),c2=j+1,c3=i+1;
44     int ii=i;
45     ll sum=0;
46     while (j)
47     {
48         i=ii;
49         while (i)
50         {
51             sum+=c1*f1[i][j]-c2*f2[i][j]-c3*f3[i][j]+f4[i][j];
52             i-=i&-i;
53         }
54         j-=j&-j;
55     }
56     return sum;
57 }
58 
59 int main()
60 {
61     int x,y,z,s,t,r;
62     scanf("%d%d",&n,&m);
63 
64     while (~scanf("%d%d%d%d%d",&x,&y,&z,&s,&t))
65     {
66         if (x==1)
67         {
68             scanf("%d",&r);
69             modify(y,z,r);
70             modify(y,t+1,-r);
71             modify(s+1,z,-r);
72             modify(s+1,t+1,r);
73         }
74         else
75             printf("%lld\n",cal(s,t)-cal(y-1,t)-cal(s,z-1)+cal(y-1,z-1));
76     }
77     return 0;
78 }
79 /*
80 
81 */

猜你喜欢

转载自www.cnblogs.com/cmyg/p/10691758.html