羅区P2280 [HNOI2003】レーザ爆弾
トピック:
ソリューション:
- プレフィックスと、二次元。
- 詐欺は、セグメントツリー/暴力を見ているようですか?
- 最初の難しさは、ゴール広場ブラストの端に位置されていない最初のトピックです。この問題を解決する方法。実際には、右上隅の翻訳に各ターゲットの座標を置くことができます。
- 例えば、(0、0)と(1、1)、オリジナルの和(1、1)2(質問の意味を満たしていない)であり、翻訳後に(1、1)に、(2、2)、合計(1、1)それはまだオンである、1になります。
- 第二の困難は、答えの右上隅に爆弾がそう(i、j)とするためには、正方形であることを話題である単純な合計(i、j)は= SUM(I - 1、j)がない+加算(I、J - 1 ) - 合計(I - 1、J - 1)A。↓を次のように、後に更新しますが、合計は、それぞれが最大のANS取ります
- ANS = MAX(ANS、和(I、J) - 和(I - R、J) - 和(I、J - R)+和(I - R、J - R))
- 私たちは、ANSがあることを確認するために取ることができるように、(i、j)は、正方形の右上隅に(強く推奨図面は理解します)
#include <iostream>
#include <cstdio>
#define maxn 5005
using namespace std;
int n, r, ans;
int sum[maxn][maxn];
int main()
{
cin >> n >> r;
for(int i = 1; i <= n; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
sum[x + 1][y + 1] = z;
}
for(int i = 1; i <= 5000; i++)
for(int j = 1; j <= 5000; j++)
sum[i][j] += (sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]);
for(int i = r; i <= 5000; i++)
for(int j = r; j <= 5000; j++)
ans = max(ans, sum[i][j] - sum[i - r][j] - sum[i][j - r] + sum[i - r][j - r]);
cout << ans;
return 0;
}