民间数据WA#32求助
查看原帖
民间数据WA#32求助
469309
凤年楼主2023/3/1 19:00
#include <bits/stdc++.h>
#define mod 998244353
#define N 1010
#define LL long long
using namespace std;

int sum[N];
int lie[N][N];//第i列第j个往后几个有土坑
int hang[N][N];//第i列第j个往后几个有土坑
int mp[N][N];
int T, id, n, m, c, f;
LL ansc, ansf;

void clear() {
    ansc = ansf = 0;
    memset(mp, 0, sizeof(mp));
    memset(lie, 0, sizeof(lie));
    memset(hang, 0, sizeof(hang));
}

void sol0() {
    printf("4 2");
    exit(0);
}
void sol1() {
    for(int i = 1;i <= T; ++i)  printf("0 0\n");
    exit(0);
}
int main() {
    scanf("%d %d", &T, &id);
    // if(id == 0) sol0();
    // if(id == 1) sol1();
    while(T--) {
        clear();
        scanf("%d %d %d %d", &n, &m, &c, &f);
        for(int i = 1;i <= n; ++i)
            for(int j = 1;j <= m; ++j) {
                scanf("%1d", &mp[i][j]);
                // if(!mp[i][j]) lie[i][j]
            }
        for(int i = n;i >= 1; --i) {
            for(int j = m;j >= 1; --j) {
                if(mp[i][j])
                    lie[i][j] = hang[i][j] = 0;
                else
                    hang[i][j] = hang[i][j+1] + 1, lie[i][j] = lie[i+1][j] + 1;
            }
        }
        for(int j = 1;j <= m; ++j) {
            memset(sum, 0, sizeof(sum));
            int tmp = 0;
            for(int i = 1;i <= n; ++i) {
                if(mp[i][j]) {//碰到土坑,不再种
                    sum[i] = 0;
                    tmp = i;
                    continue;
                }
                sum[i] = sum[i - 1] + hang[i][j] - 1;
                if(i - tmp > 2) {
                    ansc += (hang[i][j] - 1) * sum[i - 2];
                    ansf += (hang[i][j] - 1) * sum[i - 2] * (lie[i][j] - 1); 
                }
                ansc %= mod;
                ansf %= mod;
            }
        }
        printf("%lld %lld\n", (c * ansc) % mod, (f * ansf) % mod);
    }
    return 0;
}
2023/3/1 19:00
加载中...