CF1676D X-Sum 题解

题意

有一个 $n×m$ 的国际象棋盘 $a$,$(i,j)$ 上有一个非负整数 $a_{ij}$。

你要在上面放一个象,问它能攻击到的点上的非负整数和最大是多少。

(象走斜线,无距离限制)

思路

直接模拟复杂度达到 $O(n^3)$,不太行。

考虑预处理出每条斜线上的点上的非负整数和。

观察得到,左下-右上斜线上的点 $i+j$ 相等,左上-右下斜线上的点 $i-j$ 相等。

(实际上可以把左下-右上斜线看作 $y=-x+b$, 把左上-右下斜线看作 $y=x+b$)

于是计算每个点对它所在斜线的贡献即可。

代码

#include <cstdio>
#include <cstring>
int T, n, m, s, a[250][250], l[550], r[550];
int main()
{
    scanf("%d", &T);
    while(T--)
    {
        memset(l, 0, sizeof l);
        memset(r, 0, sizeof r);
        scanf("%d%d", &n, &m);s = 0;
        for(int i = 1;i <= n;++i)
            for(int j = 1;j <= m;++j)
                scanf("%d", &a[i][j]), l[i + j] += a[i][j], r[i - j + m] += a[i][j];
        for(int i = 1, t;i <= n;++i)
            for(int j = 1;j <= m;++j)
                if((t = l[i + j] + r[i - j + m] - a[i][j]) > s) s = t;
        printf("%d\n", s);
    }
    return 0;
}
posted @ 2022-05-11 09:04  5k_sync_closer  阅读(3)  评论(0编辑  收藏  举报  来源