前缀和:Sn 类似于积分
差分:dn 类似于微分
1、一维前缀和
#include<iostream>
using namespace std
;
const int N
= 100010;
int n
, m
,l
,r
;
int a
[N
], s
[N
] = { 0 };
int main() {
cin
>> n
>> m
;
for (int i
= 1; i
<= n
; i
++)
scanf_s("%d", &a
[i
]);
for (int i
= 1; i
<= n
; i
++)
s
[i
] = s
[i
- 1] + a
[i
];
while (m
--) {
scanf_s("%d %d", &l
, &r
);
cout
<< s
[r
] - s
[l
- 1] << endl
;
}
}
或
#include<iostream>
using namespace std
;
const int N
= 100010;
int n
, m
,l
,r
;
int a
[N
], s
[N
] = { 0 };
int main() {
std
::ios
::sync_with_stdio(false);
cin
>> n
>> m
;
for (int i
= 1; i
<= n
; i
++)
cin
>> a
[i
];
for (int i
= 1; i
<= n
; i
++)
s
[i
] = s
[i
- 1] + a
[i
];
while (m
--) {
cin
>> l
>> r
;
cout
<< s
[r
] - s
[l
- 1] << endl
;
}
}
2、二维前缀和
#include<iostream>
using namespace std
;
const int N
= 1010;
int n
, m
, q
,i
,j
;
int a
[N
][N
], s
[N
][N
];
int main() {
scanf_s("%d%d%d", &n
, &m
, &q
);
for ( i
= 1; i
<= n
; i
++)
for ( j
= 1; j
<= m
; j
++)
scanf_s("%d", &a
[i
][j
]);
for (i
= 1; i
<= n
; i
++)
for (j
= 1; j
<= m
; j
++)
s
[i
][j
] = s
[i
- 1][j
] + s
[i
][j
- 1] - s
[i
- 1][j
- 1]+a
[i
][j
];
while (q
--) {
int x1
, y1
, x2
, y2
;
scanf_s("%d%d%d%d", &x1
, &y1
, &x2
,&y2
);
printf("%d\n", s
[x2
][y2
]-s
[x1
-1][y2
]-s
[x2
][y1
-1]+s
[x1
-1][y1
-1]);
}
}
3、一维差分
#include<iostream>
using namespace std
;
const int N
= 100010;
int a
[N
], b
[N
];
int n
, m
,i
,l
,r
,c
;
void insert(int l
, int r
, int c
) {
b
[l
] += c
;
b
[r
+1] -= c
;
}
int main(){
scanf_s("%d%d", &n
, &m
);
for (i
= 1; i
<= n
; i
++)
scanf_s("%d", &a
[i
]);
for (i
= 1; i
<= n
; i
++)
insert(i
, i
, a
[i
]);
while (m
--) {
scanf_s("%d%d%d", &l
, &r
, &c
);
insert(l
, r
, c
);
}
for (i
= 1; i
<= n
; i
++)
b
[i
] += b
[i
- 1];
for (i
= 1; i
<= n
; i
++)
printf("%d ", b
[i
]);
}
4、二维差分
#include<iostream>
using namespace std
;
const int N
= 1010;
int a
[N
][N
], b
[N
][N
];
int n
, m
, q
,i
,j
;
void insert(int x1
, int y1
, int x2
, int y2
, int c
) {
b
[x1
][y1
] += c
;
b
[x2
+ 1][y1
] -= c
;
b
[x1
][y2
+ 1] -= c
;
b
[x2
+ 1][y2
+ 1] += c
;
}
int main() {
scanf_s("%d%d%d", &n
, &m
, &q
);
for (i
= 1; i
<= n
; i
++)
for (j
= 1; j
<= m
; j
++)
scanf_s("%d", &a
[i
][j
]);
for (i
= 1; i
<= n
; i
++)
for (j
= 1; j
<= m
; j
++)
insert(i
, j
, i
, j
, a
[i
][j
]);
int x1
, y1
, x2
, y2
,c
;
while (q
--) {
scanf_s("%d%d%d%d%d", &x1
, &y1
, &x2
, &y2
, &c
);
insert(x1
, y1
, x2
, y2
, c
);
}
for(i
=1;i
<=n
;i
++)
for(j
=1;j
<=m
;j
++)
b
[i
][j
] += b
[i
- 1][j
] + b
[i
][j
- 1] - b
[i
- 1][j
- 1] ;
for (i
= 1; i
<= n
; i
++) {
for (j
= 1; j
<= m
; j
++) {
printf("- ", b
[i
][j
]);
}
printf("\n");
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-17415.html