22pts求助!!
查看原帖
22pts求助!!
519384
Link_Cut_Y楼主2022/11/27 12:12
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int N = 1010, mod = 998244353;
int g[N][N], f[N][N];
int T, id, C, F, n, m;
char ch[N];

typedef long long LL;

LL get_c() {
    LL res = 0;
    for (int j = 1; j <= m; j ++ ) {
        for (int l = 1, r = 1; l <= n && r <= n; l = r + 1, r = l) {
            if (f[l][j] == 0) continue;
            LL s = 0; int cnt = 0;
            while (f[r][j]) r ++ ; r -- ;
            for (int i = l; i <= r; i ++ ) {
                if (f[i][j] > 1) cnt ++ ;
                if (cnt == 2 && f[i - 1][j] == 1)
                    res = (res + s * (f[i][j] - 1)) % mod;
                else if (cnt > 2 && f[i - 1][j] == 1)
                    res = (res + s * (f[i][j] - 1)) % mod;
                else if (cnt > 2 && f[i - 1][j] > 1)
                    res = (res + (s - f[i - 1][j] + 1) * (f[i][j] - 1)) % mod;
                s = s + (f[i][j] - 1);
            }
        }
    }
    return res;
}

LL get_f() {
    LL ans = 0;
    for (int j = 1; j <= m; j ++ ) {
        for (int l = 1, r = 1; l <= n && r <= n; l = r + 1, r = l) {
            if (f[l][j] == 0) continue;
            LL s = 0, res = 0; int cnt = 0;
            while (f[r][j]) r ++ ; r -- ;
            for (int i = l; i <= r; i ++ ) {
                if (f[i][j] > 1) cnt ++ ;
                if (i == r) break;
                if (cnt == 2 && f[i - 1][j] == 1)
                    res = (res + s * (f[i][j] - 1)) % mod;
                else if (cnt > 2 && f[i - 1][j] == 1)
                    res = (res + s * (f[i][j] - 1)) % mod;
                else if (cnt > 2 && f[i - 1][j] > 1)
                    res = (res + (s - f[i - 1][j] + 1) * (f[i][j] - 1)) % mod;
                s = s + (f[i][j] - 1);
            }
            int i = r;
            if (f[i][j] > 1) {
                ans = (ans + res) % mod; i -- ;
                while (f[i][j] == 1) ans = (ans + res) % mod, i -- ;
            }
            else {
                while (f[i][j] == 1) ans = (ans + res) % mod, i -- ;
            }
        }
    }
    return ans;
}

int main() {
    scanf("%d%d", &T, &id);
    while (T -- ) {
        scanf("%d%d%d%d", &n, &m, &C, &F);
        for (int i = 1; i <= n; i ++ ) {
            scanf("%s", ch + 1);
            for (int j = 1; j <= m; j ++ )
                g[i][j] = ch[j] - '0';
        }
        for (int i = 1; i <= n; i ++ )
            for (int j = m; j; j -- )
                if (g[i][j]) f[i][j] = 0;
                else f[i][j] = f[i][j + 1] + 1;
        
        printf("%lld %lld\n", (get_c() * C) % mod, (get_f() * F) % mod);
    }
}
/*
1 0
6 6 1 1
000010
011000
000110
010000
011000
000000
*/
2022/11/27 12:12
加载中...