羅区P2280 [HNOI2003】レーザ爆弾

羅区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;   
}

おすすめ

転載: www.cnblogs.com/BigYellowDog/p/11203149.html