12分求调,悬关
查看原帖
12分求调,悬关
974277
水星湖psgqwq楼主2024/7/25 12:26
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
const int N = 1e3 + 5;
int t, id, n, m, c, f;
int a[N][N], s1[N][N], s2[N][N], s3[N][N];
void solve() {
    cin >> n >> m >> c >> f;
    memset(s1, 0, sizeof(s1));
    memset(s2, 0, sizeof(s2));
    memset(s3, 0, sizeof(s3));
    memset(a, 0, sizeof(a));
    for(int i = 1; i <= n; i++) {
        string s; cin >> s;
        for(int j = 1; j <= m; j++)
            a[i][j] = s[j - 1] - '0';
    }
    for(int i = 1; i <= n; i++) 
        for(int j = m - 1; j >= 1; j--)
            s1[i][j] = (a[i][j + 1] == 1 ? 0 : s1[i][j + 1] + 1) % mod;
    
    for(int j = 1; j < m; j++) 
        for(int i = 2; i <= n; i++) 
            s2[i][j] = (a[i - 1][j] == 1 ? 0 : s2[i - 1][j] + s1[i - 1][j]) % mod;
            

    for(int j = 1; j < m; j++)
        for(int i = 3; i <= n; i++)
            s3[i][j] = (a[i - 1][j] == 1 ? 0 : s3[i - 1][j] + (a[i - 2][j] == 0 && a[i - 3][j] == 0) *
                                                 max(s3[i - 2][j], s1[i - 3][j]) * s1[i - 1][j] % mod) % mod;

    int vc = 0, vf = 0;
    for(int i = 3; i <= n; i++)
        for(int j = 1; j < m; j++) {
            vc = (vc + (a[i][j] == 0 && a[i-1][j] == 0) * s1[i][j] * s2[i-1][j] % mod) % mod;
            vf = (vf + (a[i][j] == 0) * s3[i][j] % mod) % mod;    
        }
    cout << vc * c << " " << vf * f << endl;
}


signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> t >> id;
    while(t--) {
        solve();
    }

    return 0;
}

2024/7/25 12:26
加载中...