1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int o[5010][5010];
void add(int x, int y, int v) { o[x][y] += v; }
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, r, x, y, v;
cin >> n >> r;
int max_x = r, max_y = r;
for (int i = 0; i < n; i++) {
cin >> x >> y >> v;
if (x > max_x) {
max_x = x;
}
if (y > max_y) {
max_y = y;
}
add(x, y, v);
}
// Tính tổng tiền tố trên cột y=0
for (int i = 1; i <= max_x; i++) {
o[i][0] += o[i - 1][0];
}
// Tính tổng tiền tố trên hàng x=0
for (int j = 1; j <= max_y; j++) {
o[0][j] += o[0][j - 1];
}
// Tính tổng tiền tố từ (1,1)
for (int _x = 1; _x <= max_x; _x++) {
for (int _y = 1; _y <= max_y; _y++) {
o[_x][_y] =
o[_x][_y] + o[_x - 1][_y] + o[_x][_y - 1] - o[_x - 1][_y - 1];
}
}
int rt = 0;
// Tính tổng trong ma trận bắt đầu từ (_x-r+1, _y-r+1) đến (_x, _y)
for (int _x = r - 1; _x <= max_x; _x++) {
for (int _y = r - 1; _y <= max_y; _y++) {
int v1, v2, v3, v4;
v1 = o[_x][_y];
if (_x - r < 0) {
v2 = 0;
} else {
v2 = o[_x - r][_y];
}
if (_y - r < 0) {
v3 = 0;
} else {
v3 = o[_x][_y - r];
}
if (_y - r < 0 || _x - r < 0) {
v4 = 0;
} else {
v4 = o[_x - r][_y - r];
}
rt = max(rt, v1 - v2 - v3 + v4);
}
}
cout << rt;
return 0;
}
|